5

私は次のように NSNumber にまとめられた Unicode 文字の束を持っています:

@(0x1f4de),    // EntypoIconTypePhone
@(0x1f4f1),    // EntypoIconTypeMobile
@(0xe789),     // EntypoIconTypeMouse
@(0xe723),     // EntypoIconTypeAddress
@(0x2709),     // EntypoIconTypeMail
@(0x1f53f),    // EntypoIconTypePaperPlane
@(0x270e),     // EntypoIconTypePencil

これらは Entypo フォントのアイコンです (強くお勧めします)。

これは、ユニコードから NSString を作成するために使用しているコードです。

NSNumber *u = self.unicodeLookup[type];

int unicode = [u intValue];
UniChar chars[] = {unicode};

NSString *string = [[NSString alloc] initWithCharacters:chars length:sizeof(chars) / sizeof(UniChar)];

私が見つけたのは、これらのアイコンの一部は期待どおりに作成されていますが、すべてではありません。そして、私が見ることができるのは、適切に作成されていない5桁のUnicodeです。

たとえば、これらの作品:

@(0xe723),     // EntypoIconTypeAddress
@(0x2709),     // EntypoIconTypeMail

しかし、これらはしません:

@(0x1f4de),    // EntypoIconTypePhone
@(0x1f4f1),    // EntypoIconTypeMobile

これが私の変換コードだと確信しています。私は、このエンコーディングの悪意をすべて理解していません。

4

2 に答える 2

2

unicharオブジェクトではなくを使用して文字定数を格納するNSNumberと、コンパイラ自体が理由を通知します。

unichar chars[] = 
{
    0xe723,     // EntypoIconTypeAddress
    0x2709,     // EntypoIconTypeMail
    0x1f4de,    // EntypoIconTypePhone
    0x1f4f1     // EntypoIconTypeMobile
};

Implicit conversion from 'int' to 'unichar' (aka 'unsigned short') changes value from 128222 to 62686
Implicit conversion from 'int' to 'unichar' (aka 'unsigned short') changes value from 128241 to 62705

iOS/OSX は Unicode 文字の 16 ビット表現を内部で使用し、0x1f4deどちら0x1f4f1も 32 ビットであるため、これらの文字をサロゲート ペアとしてエンコードする必要があります。

a = 0x1f4de - 0x10000 = 0xf4de
high = a >> 10 = 0x3d
low = a & 0x3ff = 0xde
w1 = high + 0xd800 = 0xd83d
w2 = low + 0xdc00 = 0xdcde

0x1f4de (UTF-32) = 0xd83d 0xdcde (UTF-16)

(このウィキペディアのページを参照してください)。

結果として、各文字のエンコーディングの長さを知る必要があるため、単一の Unicode 文字配列を使用することはできません。

于 2013-06-04T10:11:57.090 に答える