将NSString减小为小写,ascii alpha字符

时间:2012-03-01 17:14:09

标签: objective-c cocoa nsstring

如何将NSString缩小为小写的ascii字母字符(/a-z/)?非英语字母字符应转换为ascii字符。具体来说,大写字符变为小写(A→a),非英语字符变为英文字符(ñ→n),所有其他字符都被丢弃。

例如:“Västerås,Sweden”变为“vasterassweden”

2 个答案:

答案 0 :(得分:6)

您可以将字符串转换为包含代表不同编码字符串的字节的NSData,并允许使用dataUsingEncoding:allowLossyConversion进行有损转换。然后,您只需将NSData转换回NSString

即可
NSString *unicode = @"Västerås, Sweden";
NSString *ascii = [[NSString alloc]
                   initWithData:[unicode dataUsingEncoding:NSASCIIStringEncoding
                                      allowLossyConversion:YES
                                ]
                       encoding:NSASCIIStringEncoding
                  ];

结果是“瑞典韦斯特罗斯”。现在有一个lowercaseString方法等,如果你需要更进一步。

编辑:

哎呀,错过了问题的结尾“并且所有其他角色都被丢弃了”,你确实希望更进一步:

NSString *lower = [ascii lowercaseString];
NSString *letters = [[lower
                      componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet]
                                                            invertedSet]
                                                           ]
                      componentsJoinedByString:@""
                    ];

这看起来很糟糕(并且转换为C字符串并且更直接地执行它是一个很好的参数),但它完成了工作:componentsSeparatedByCharactersInSet:通过将提供的集合中的字符视为字符串来返回字符串数组分隔符; componentsJoinedByString:将一个字符串数组连接到由提供的字符串分隔的单个字符串中 - 我们已经传递了一个空连接符。

答案 1 :(得分:1)

您可以按照以下方式执行此操作:

NSString *inputString = @"Västerås  ;; Swed   en    ";

NSLog(@"Input String %@",inputString);

inputString = [inputString lowercaseString]; // Lower case

inputString = [inputString stringByReplacingOccurrencesOfString:@" " withString:@""]; //Whitespace

inputString = [[inputString componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""]; //Punctuation

inputString = [[inputString componentsSeparatedByCharactersInSet:[NSCharacterSet decomposableCharacterSet]] componentsJoinedByString:@""]; // non-english characters