首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSString -仅转换为纯字母(即删除accents+punctuation)

NSString -仅转换为纯字母(即删除accents+punctuation)
EN

Stack Overflow用户
提问于 2009-08-05 07:57:58
回答 13查看 27K关注 0票数 26

我正在尝试比较没有任何标点符号、空格、重音等的名称。目前,我正在进行以下操作:

代码语言:javascript
复制
-(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;
}

但是,我需要对数百个字符串执行此操作,并且需要使其更有效率。有什么想法吗?

EN

回答 13

Stack Overflow用户

发布于 2009-08-05 08:54:40

代码语言:javascript
复制
NSString* finish = [[start componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];
票数 81
EN

Stack Overflow用户

发布于 2009-08-05 15:46:15

在使用这些解决方案之前,不要忘记使用decomposedStringWithCanonicalMapping来分解任何重音字母。例如,这会将é(U+00E9)转换为e‌́(U+0065 U+0301)。然后,当您剔除非字母数字字符时,未重音的字母将保留。

这很重要的原因是你可能不想,比如说,“dän”和“dün”*被当作一样对待。如果您去掉了所有重音字母,就像这些解决方案中的一些可能做的那样,您将以“dn”结束,因此这些字符串将进行相等的比较。

所以,你应该首先分解它们,这样你就可以去掉重音并保留字母。

*来自德语的示例。感谢Joris Weimar提供它。

票数 39
EN

Stack Overflow用户

发布于 2013-12-04 11:37:22

On a similar question, Ole Begemann suggests using stringByFoldingWithOptions:和我相信这是最好的解决方案:

NSString *accentedString =@“currentLocale”;NSString *unaccentedString = [accentedString NSLocale locale currentLocale];

根据要转换的字符串的性质,您可能希望设置固定的区域设置(例如英语),而不是使用用户的当前区域设置。这样,您就可以确保在每台机器上获得相同的结果。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1231764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档