替换字符串中的字母

时间:2012-05-24 14:05:40

标签: objective-c ios nsstring replace

您好我有一个问题,我不知道如何解决。问题是我甚至不知道如何谷歌。我已经花了几个小时在互联网上寻找解决方案,但没有成功。情况是这样的:

我有字符串,让我们说:

NSString *string = @"aąbcčdeęėfghiįjzž";

我的结果必须是这样的:

NSString *string = @"aabccdeeefghiujzz";

所以如果你明白我必须这样做:

替换±

用c

替换č

用e

替换ė

用e

替换ę

依旧......

也许有人可以帮助我?我有一个答案,但它没有得到很好的优化,我希望有一些更方便的解决方案。

提前致谢!

4 个答案:

答案 0 :(得分:11)

让框架为您进行转换:

NSString *blah = @"aąbcčdeęėfghiįjzž";
NSData *data = [blah dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newblah = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"new: %@", newblah);

此日志:

new: aabccdeeefghiijzz

答案 1 :(得分:5)

这将有效:

NSString *str = @"aąbcčdeęėfghiįjzž";
NSLog(@"%@", str);
NSMutableString *s = [[str decomposedStringWithCompatibilityMapping] mutableCopy];
NSUInteger pos = 0;
while(pos < s.length) {
    NSRange r = [s rangeOfComposedCharacterSequenceAtIndex:pos];
    if (r.location == NSNotFound) break;
    pos = ++r.location;
    if (r.length == 1) continue;
    r.length--;
    [s deleteCharactersInRange:r];
}
NSLog(@"%@", s);

这个想法是首先用变音符号将每个字符分解为其基本字符的序列和Unicode combining diacritical marks的序列(由decomposedStringWithCompatibilityMapping完成),然后遍历字符串,并删除所有字符这样的标记一个接一个(这就是循环所做的)。

答案 2 :(得分:0)

我只能提供这个:

[string stringByReplacingOccurrencesOfString:@"ą" withString:@"a"];

依旧......

答案 3 :(得分:0)

Dave DeLong的回答将用“ae”代替“æ”,用“s”代替“ß”,但不会取代连字œ,ij,ff,fi,fl,ffi,ffl,ft,st,..

改进的解决方案是添加三行映射来处理所有问题:

blah = [blah stringByReplacingOccurrencesOfString:@"Œ" withString:@"OE"];
blah = [blah stringByReplacingOccurrencesOfString:@"œ" withString:@"oe"];
blah = [blah precomposedStringWithCompatibilityMapping];

NSData *data = [blah dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newblah = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];