我有NSString
和 unicode代码点范围,它代表NSString
中文本的特定部分。由于NSString
中的字符与代码点并不一一对应,我需要以某种方式将我的代码点范围转换为相应的字符范围。我该怎么做?
I know I can use NSString
方法-rangeOfComposedCharacterSequencesForRange:
将字符范围转换为字形集群范围,但我想要做的是与此相反,我不能在API中找到该方法的反转。即使有这样的方法可用,我也不认为这正是我正在寻找的,因为(如果我理解正确的话)字形集群与a不同 unicode代码点,实际上可以由多个代码点组成。
答案 0 :(得分:1)
你所拥有的是来自两个不同世界的混合数据。您通常可以获得Unicode代码点范围以及UTF-32字符串(其中对应关系是一对一的),因此提取子字符串将是微不足道的。您有两种选择:
我从你的问题中假设#2是你案件中最简单的选择。
正如您所说,NSString中的字符与Unicode代码点并不一一对应,因为NSString字符是UTF-16单元。但是,Unicode代码点对应于NSString中的1个或2个字符。通过迭代NSString字符并计算Unicode代码点,您可以相当轻松地编写自己的范围转换例程。由于您甚至不关心UTF-16数据的字节顺序,因为有效的BMP字符,主要代理项和跟踪代理项是不相交的,因此这样做更容易一些。 CFString提供了一些函数来确定每个字符是什么。所以在伪代码中,你的计数看起来像:
for each NSString character {
if (CFStringIsSurrogateHighCharacter(character) ||
CFStringIsSurrogateLowCharacter(character))
{
Skip forward another character in the NSString
}
Increment count of Unicode code points stepped through
}