0

在任何 URL 中,您都可以使用特殊字符,例如 * ? & ~ : / *

很快,如果还没有,强调字符

我想要的是将任何 url 转换为最接近纯 ASCII 字符的等价物,
然后用 _ 替换任何剩余的特殊字符

我已经通过网络上的许多示例尝试了这个看起来和鼓舞人心的 myslef,但它不起作用(例如,使用此代码,字符“é”不会转换为“e” @"http://www.mélange.fr/~fermer.php?aa=10&ee=13"

NSMutableCharacterSet *charactersToKeep = [NSMutableCharacterSet alphanumericCharacterSet];
[charactersToKeep addCharactersInString:@"://&=~?"];
NSCharacterSet* charactersToRemove = [charactersToKeep invertedSet];
myNSString = [[[myNSString decomposedStringWithCanonicalMapping] componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""];

to start, after I will have to convert remaining special characters with _

我怎样才能做到这一点?

作为示例(并且仅作为示例),我想转换:

http://www.mélange.fr/~fermer.php?aa=10&ee=13

http___www.melange.fr__fermer_php_aa_10_ee_13

当然不必一一检查每个可能的特殊或重音字符

4

1 回答 1

3

两个想法:

  1. 要将重音字符替换为非重音字符,有几个候选者:

    • 您可以使用CFStringTransform

      NSMutableString *mutableString = [string mutableCopy];
      CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformStripCombiningMarks, NO);
      
    • 你可以使用dataUsingEncoding:allowLossyConversion:

      NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
      NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      

      字符它不知道如何处理成为?,但这有时会用多个字符(例如©with (C))替换一个字符,您可能想要也可能不想要。

  2. 完成此国际字符转换后,您似乎希望将任何非字母数字字符(或句点)替换为下划线,您可以使用stringByReplacingOccurrencesOfString正则表达式来执行此操作:

        NSString *result = [string stringByReplacingOccurrencesOfString:@"[^a-z0-9\\.]"
                                                             withString:@"_"
                                                                options:NSRegularExpressionSearch | NSCaseInsensitiveSearch
                                                                  range:NSMakeRange(0, [string length])];
    

    这个正则表达式有很多排列可以完成同样的事情,但希望你明白这一点。

于 2013-07-18T21:34:25.917 回答