【发布时间】:2013-03-13 00:19:30
【问题描述】:
我想知道,有什么方法可以获取存储在 CoreFoundation 框架的 CFString 对象中的字符数(由底层 Unicode代码点 表示)。
有可用的功能:CFStringGetLength,但它并没有做它看起来做的事情。
示例:我正在尝试获取包含位于第二个 (SMP) Unicode 平面中的一个字符(Shavian Alphabet 的字母“窥视”)的字符串长度。
UInt8 arr[] = {0xf0, 0x90, 0x91, 0x90}; //UTF8
CFStringRef r = CFStringCreateWithBytes(0, arr, sizeof(arr),
kCFStringEncodingUTF8, false);
CFIndex length = CFStringGetLength(r);
文档说明它返回:
存储在字符串中的字符数(以 UTF-16 代码对表示)。
正如你所看到的,这句话是矛盾的——字符数并不总是等于 UTF-16 代码点的数量。但是,大括号中的部分更准确 - 函数的实际结果是 UTF-16 序列的数量。在我的示例中,函数的结果是 2(以 UTF-16 编码字符所需的序列长度),而函数名称表明结果将是 1 (在我看来)。
我想找到一种方法来获取 Unicode 码位方面的字符数。 CoreFoundation有什么办法吗?
【问题讨论】:
-
CFStringGetLength()实际上返回“以 Unicode 代码点表示”的字符数。渲染 '????' 所需的 UTF-16 字符序列是 [0xD801,0xDC50]。您似乎要查找的内容(更准确地说)是返回由底层 UTF-16 序列。我将使用正确的 CF API 编写一个示例,该示例很快就能满足您的需求。 -
@Sean 除了“UTF-16 代码对”之外,我找不到任何
CFStringGetLength返回的定义。而且我找不到任何线索“UTF-16 代码对”是什么意思。你能解释一下“代码对”实际上是“代码点”吗?
标签: unicode core-foundation cfstring