如何“标准化”URL替换任何特殊字符与新的特殊字符

时间:2013-07-18 21:14:36

标签: iphone url nsstring ascii special-characters

在任何网址中,您都可以使用* 等特殊字符? &安培; 〜:/ *

如果还没有,强调字符

我想要的是将任何网址转换为纯ASCII字符中最接近的网址 然后用_

替换任何剩余的spécial字符

我尝试了这个看起来很有启发性的myslef,网上有很多例子,但它不起作用(例如,使用此代码,@"http://www.mélange.fr/~fermer.php?aa=10&ee=13"中的字符“é”未转换为“e” )

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

当然无需逐个检查每个可能的特殊或重点字符

1 个答案:

答案 0 :(得分: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];
      

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

  2. 进行此国际字符转换后,您似乎希望用下划线替换任何非字母数字字符(或句点),您可以使用带有正则表达式的stringByReplacingOccurrencesOfString替换:< / p>

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

    这个正则表达式有许多排列可以完成同样的事情,但希望你能得到这个想法。