NSString from Unicode



我有一堆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

我很确定这是我的转换代码。我真的不明白这些编码的废话

如果你使用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字符,而0x1f4de0x1f4f1都是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字符数组,因为你必须知道每个字符的编码长度。

如果我用它来创建我的字符串它适用于Entypo字体unicode int values:

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

uniCharsint s中的CArray,而不是我之前知道的NSNumber s中的NSArray。没有理由这样做,它应该可以同时工作。

更新:

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

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

最新更新