2013-07-03 39 views
0

我想洗牌包含希臘字符的字符串:洗牌iOS中一個希臘字打印未知符號

這裏是我的代碼:

- (void)shuffle { 
    NSLog(@"Will shuffle :%@",anagram2); 

    NSData* data = [anagram2 dataUsingEncoding:NSWindowsCP1253StringEncoding]; 
    NSLog(@"after encoding :%@",anagram2); 

    NSString *someString = [[NSString alloc]initWithData:data encoding:NSWindowsCP1253StringEncoding]; 
    NSLog(@"Greek word:%@",someString); 

    int length = anagram2.length; 
    NSMutableArray *letters = [[NSMutableArray alloc] init]; 

    for (int i = 0; i< length; i++) { 
     NSString *letter = [NSString stringWithFormat:@"%c", [someString characterAtIndex:i]]; 
     NSLog(@"Character:%@",letter); 

     [letters addObject:someLetter]; 
    } 
    for (int i = 0; i<length; i++) { 
     int value = arc4random() % (length-1); 
     //NSLog(@"Value is : %i", value); 
     [letters exchangeObjectAtIndex:i withObjectAtIndex:value]; 
    } 
} 

我可以正確地看到希臘字。但洗牌不起作用。如何提取每個字符並將其添加到字母數組中。它適用於英文單詞但不適用於希臘單詞,所以我想我應該取代它:

NSString *letter = [NSString stringWithFormat:@"%c", [someString characterAtIndex:i]]; 

與其他東西。

+0

你爲什麼要解碼,然後用相同的字符編碼重新編碼字符串數據?這似乎毫無意義,如果你想要的只是一個字符串字符串的副本(當你將所有字符複製到可變數組中時,你甚至不需要這樣做)(順便說一句,你可以預先分配一個大小等於使用'initWithCapacity:'的字母數量,可以讓事情更有效率。))。 – JAB

+0

@JAB我這樣做來回調試。你能告訴我我應該打電話什麼地方嗎? – ghostrider

+0

發佈的代碼的另一個問題 - 你從'anagram2'派生'length',但是你從'someString'中提取字符。確保兩者都使用相同的字符串。 – rmaddy

回答

2

主要的問題在我看來,

[NSString stringWithFormat:@"%c":...] 

與ASCII字符纔有效。您必須至少使用"%C"格式才能使 與Unicode字符配合使用。

同樣,從NSStringNSData的轉換和返回將會失敗,只要您有任何字符在指定的編碼中不可用。

下面的方法避免了所有這些問題,並應與任意Unicode字符 (甚至使用表情符號,其在內部表示爲2 UTF-16字符)工作:

NSString *string = @"Ελλάδα "; 
NSLog(@"Will shuffle: %@", string); 

// Convert string to an array of (32 bit) Unicode characters: 
NSMutableData *data = [[string dataUsingEncoding:NSUTF32BigEndianStringEncoding] mutableCopy]; 
uint32_t *letters = [data mutableBytes]; 
int length = [data length]/4; // The number of 32-bit Unicode characters 

// Shuffle the Unicode characters: 
for (int i = 0; i<length; i++) { 
    int value = arc4random() % (length-1); 
    uint32_t tmp = letters[i]; 
    letters[i] = letters[value]; 
    letters[value] = tmp; 
} 

// Create new string from the shuffled Unicode characters: 
NSString *shuffled = [[NSString alloc] initWithData:data encoding:NSUTF32BigEndianStringEncoding]; 
NSLog(@"Shuffled:  %@", shuffled); 

輸出:

 
Will shuffle: Ελλάδα 
Shuffled:  αάλλ Εδ 
+0

我不確定洗牌算法(從您的問題中複製)是否100%正確。如果我找到某些東西,我會更新答案... –

+0

它與%C一起工作。謝謝!! – ghostrider

+0

建議 - 使用'int value = arc4random_uniform(length);'。 – rmaddy