0

ギリシャ文字を含む文字列をシャッフルしたい:

これが私のコードです:

- (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]];

他の何かと。

4

1 に答える 1

2

主な問題は私には思えます

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

ASCII 文字でのみ機能します。"%C"Unicode 文字で動作させるには、少なくともこの形式を使用する必要があります。

また、指定されたエンコーディングで使用できない文字があるとすぐに、 との間の変換が失敗NSStringします。NSData

次の方法は、これらの問題をすべて回避し、任意の 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);

出力:

シャッフルします: Ελλάδα
シャッフル: αάλλ Εδ
于 2013-07-03T19:21:17.517 に答える