我正在尝试比较没有任何标点符号、空格、重音等的名称。目前,我正在进行以下操作:
-(NSString*) prepareString:(NSString*)a {
//remove any accents and punctuation;
a=[[[NSString alloc] initWithData:[a dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];
a=[a stringByReplacingOccurrencesOfString:@" " withString:@""];
a=[a stringByReplacingOccurrencesOfString:@"'" withString:@""];
a=[a stringByReplacingOccurrencesOfString:@"`" withString:@""];
a=[a stringByReplacingOccurrencesOfString:@"-" withString:@""];
a=[a stringByReplacingOccurrencesOfString:@"_" withString:@""];
a=[a lowercaseString];
return a;
}但是,我需要对数百个字符串执行此操作,并且需要使其更有效率。有什么想法吗?
发布于 2009-08-05 08:54:40
NSString* finish = [[start componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];发布于 2009-08-05 15:46:15
在使用这些解决方案之前,不要忘记使用decomposedStringWithCanonicalMapping来分解任何重音字母。例如,这会将é(U+00E9)转换为é(U+0065 U+0301)。然后,当您剔除非字母数字字符时,未重音的字母将保留。
这很重要的原因是你可能不想,比如说,“dän”和“dün”*被当作一样对待。如果您去掉了所有重音字母,就像这些解决方案中的一些可能做的那样,您将以“dn”结束,因此这些字符串将进行相等的比较。
所以,你应该首先分解它们,这样你就可以去掉重音并保留字母。
*来自德语的示例。感谢Joris Weimar提供它。
发布于 2013-12-04 11:37:22
On a similar question, Ole Begemann suggests using stringByFoldingWithOptions:和我相信这是最好的解决方案:
NSString *accentedString =@“currentLocale”;NSString *unaccentedString = [accentedString NSLocale locale currentLocale];
根据要转换的字符串的性质,您可能希望设置固定的区域设置(例如英语),而不是使用用户的当前区域设置。这样,您就可以确保在每台机器上获得相同的结果。
https://stackoverflow.com/questions/1231764
复制相似问题