检查字符的Unicode值范围

4

在 Objective-C 中...

如果我有一个字符,如“∆”,我该如何获取其Unicode值,并确定它是否在某个范围内。

例如,如果我想知道某个字符是否在 Unicode 范围 U+1F300U+1F6FF 中,该怎么办呢?


1
好问题。如果字符小于U+FFFF,那么这很简单,只需使用unichar即可。但是对于大于等于U+10000的字符,我还没有看到一个好的方法。 - rmaddy
@rmaddy,“unichar”是用于确定在“U+FFFF”下一个字符的Unicode值是什么,还是用于确定给定Unicode值所在范围的方法? - Albert Renshaw
1
unichar是一种数据类型。请参阅NSString characterAtIndex:方法。 - rmaddy
@rmaddy 到目前为止工作得很好...当我尝试使用 NSLogging 时,我使用了 %hu,一直可以工作到 55357 ...然后在那之后的每个 unichar 都返回值 55357,无论我如何增加它们的值...除了 %hu 还能用什么? - Albert Renshaw
“有一个字符”是什么意思?你在哪里拥有它?如何拥有它?它在一个变量中吗?它是什么类型的?这个字符是如何表示的(例如UTF-8,UTF-16)? - Ken Thomases
暂时没有具体内容...但为了举例,我们可以说它是在标准的NSString中。 - Albert Renshaw
1个回答

2

NSString使用UTF-16来存储内部的码点,因此您寻找的范围内的码点(U+1F300U+1F6FF)将被存储为一个代理对(四个字节)。尽管它的名称是characterAtIndex:(和unichar),但它不知道码点,并且将给您在您提供的索引处看到的两个字节(您看到的55357是UTF-16中代码点的前导代理)。

要检查原始码点,您需要将字符串/字符转换为UTF-32(直接编码它们)。要做到这一点,您有几个选项:

  1. 获取组成代码点的所有UTF-16字节,并使用此算法CFStringGetLongCharacterForSurrogatePair来将代理对转换为UTF-32。

  2. 使用dataUsingEncoding:getBytes:maxLength:usedLength:encoding:options:range:remainingRange:NSString转换为UTF-32,并将原始字节解释为uint32_t

  3. 使用像ICU这样的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接