5

我有一堆 unicode 字符包裹在 NSNumber 中,如下所示:

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

这些是来自 Entypo 字体的图标(强烈推荐)。

这是我用来从 unicode 创建 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

如果我使用它来创建我的 String 它适用于 Entypo 字体 unicode int 值:

int unicode = uniChars[type];

NSString* s = [[NSString alloc] initWithBytes:&unicode length:sizeof(unicode)  encoding:NSUTF32LittleEndianStringEncoding];

uniChars是 a CArrayof ints 而不是我之前的NSArrayof s。NSNumber真的没有理由,它应该同时适用于两者。

更新 :

一些 unicode 数字仍然存在问题。未显示 Entypo Social 字体字符。这些和普通图标的区别在于它们都以 F 开头并且有 4 个字符:

0xF300 ,         //   EntypoIconSocialTypeGithub,
0xF301 ,         //   EntypoIconSocialTypeCGithub,
0xF303 ,         //   EntypoIconSocialTypeFlickr,
0xF304 ,         //   EntypoIconSocialTypeCFlickr,

我怀疑编码会有所不同。

于 2013-06-04T08:16:04.737 回答
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 在内部使用 16 位的 unicode 字符表示,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 回答