2012-05-24 176 views
4

你好,我有一个问题,我不知道如何解决。问题是,我甚至不知道如何谷歌。我已经花了数小时在网上寻找解决方案,但没有成功。情况是这样的:替换字符串中的字母

我有串,让​​说:

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

我的成绩是这样的:

NSString *string = @"aabccdeeefghiujzz"; 

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

用一个

代替±

用c代替012

随e代替E.

随e

等代替E. ..

也许有人可以帮助我吗?我有一个答案,但它不是非常优化,我希望有一些更方便的解决方案。

在此先感谢!

+2

这可以帮助你:http://stackoverflow.com/questions/1231764/nsstring-convert-to-pure-alphabet-only-i-e-remove-accentspunctuation – Luke

+0

感谢您的帮助!但戴夫德隆解决方案是我看到的最好的解决方案。 – Lukas

回答

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 
+0

呃......我喜欢这很容易,但哇,它感觉像黑魔法。这种行为可靠吗? –

+0

根据文档@JefferyThomas,[这就是为什么该方法存在](http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString。HTML#// apple_ref/DOC/UID/20000154-dataUsingEncoding_allowLossyConversion_)。所以是的,我会说它是可靠的。 :) –

+0

这很好。我很抱歉,我应该在提问前加上RTFM。 –

0

我只能提供这样的:

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

等等...

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完成的)序列,然后遍历字符串,并逐个删除所有这些标记(这就是循环的作用ES)。

+0

聪明的做法。 –

+0

@DaveDeLong谢谢!我也喜欢你的想法 - 将字符串拧成ASCII码并将其拉回来非常可爱。 – dasblinkenlight

0

戴夫·德隆的答案将取代 “AE” 与 “AE” 和 “SS” 与 “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]; 
相关问题