2013-12-12 5 views
5

MUSICAL SYMBOL G CLEFシンボルのように、U + FFFFより大きいユニコード文字を含むNSStringがあります。 NSStringを作成して表示することができます。NSStringで32ビットのユニコード文字を扱う方法

NSString *s = @"A\U0001d11eB"; // "AB" 
NSLog(@"String = \"%@\"", s); 

ログは正しく、3文字を表示します。これはNSStringがうまくいっていて、エンコーディングの問題がないことを伝えます。

String = "AB" 

しかし、私はこの方法を使用して、すべての文字をループしようとすると、

- (unichar)characterAtIndex:(NSUInteger)index 

すべてがうまくいきません。

タイプunicharは16ビットなので、私は音楽記号に間違った文字を取得すると予想しています。しかし、文字列の長さも間違っています!

NSLog(@"Length = %d", [s length]); 
for (int i=0; i<[s length]; i++) 
{ 
    NSLog(@" Character %d = %c", i, [s characterAtIndex:i]); 
} 

ディスプレイ

Length = 4 
     Character 0 = A 
     Character 1 = 4 
     Character 2 = . 
     Character 3 = B 

どのような方法で、私は正しく私のNSStringを解析して、私の3つのUnicode文字を取得するために使用する必要がありますか? 適切なメソッドは、wchar_tのような型をunicharの代わりに返すのが理想です。

答えて

5
NSString *s = @"A\U0001d11eB"; 
NSData *data = [s dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; 
const wchar_t *wcs = [data bytes]; 
for (int i = 0; i < [data length]/4; i++) { 
    NSLog(@"%#010x", wcs[i]); 
} 

出力ありがとう:

 
0x00000041 
0x0001d11e 
0x00000042 

(。コードはwchar_tは4バイトのサイズとリトルエンディアンエンコーディングを持っていることを前提として)

lengthcharAtIndex:をしません\U0001d11e が内部的にUTF-16 "サロゲートとして格納されているため、期待される結果を得るペア"。

一般的なUnicode文字列のための別の有用な方法は、

[s enumerateSubstringsInRange:NSMakeRange(0, [s length]) 
       options:NSStringEnumerationByComposedCharacterSequences 
      usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    NSLog(@"%@", substring); 
}]; 

出力されます:これは完全に私の質問に答える

 
A 

B 
+0

。そんなにマーティンありがとう! – PatrickV

関連する問題