在 Objective-C 中...
如果我有一个字符,如“∆”,我该如何获取其Unicode值,并确定它是否在某个范围内。
例如,如果我想知道某个字符是否在 Unicode 范围 U+1F300
到 U+1F6FF
中,该怎么办呢?
在 Objective-C 中...
如果我有一个字符,如“∆”,我该如何获取其Unicode值,并确定它是否在某个范围内。
例如,如果我想知道某个字符是否在 Unicode 范围 U+1F300
到 U+1F6FF
中,该怎么办呢?
NSString
使用UTF-16来存储内部的码点,因此您寻找的范围内的码点(U+1F300
至U+1F6FF
)将被存储为一个代理对(四个字节)。尽管它的名称是characterAtIndex:
(和unichar
),但它不知道码点,并且将给您在您提供的索引处看到的两个字节(您看到的55357
是UTF-16中代码点的前导代理)。
要检查原始码点,您需要将字符串/字符转换为UTF-32(直接编码它们)。要做到这一点,您有几个选项:
获取组成代码点的所有UTF-16字节,并使用此算法或CFStringGetLongCharacterForSurrogatePair
来将代理对转换为UTF-32。
使用dataUsingEncoding:
或getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
将NSString
转换为UTF-32,并将原始字节解释为uint32_t
。
使用像ICU这样的库。
U+FFFF
,那么这很简单,只需使用unichar
即可。但是对于大于等于U+10000
的字符,我还没有看到一个好的方法。 - rmaddyunichar
是一种数据类型。请参阅NSString characterAtIndex:
方法。 - rmaddy%hu
,一直可以工作到55357
...然后在那之后的每个 unichar 都返回值55357
,无论我如何增加它们的值...除了%hu
还能用什么? - Albert RenshawNSString
中。 - Albert Renshaw