2012-05-24 206 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]; 
相關問題