如何将unicode代码点范围转换为NSString字符范围?

时间:2012-08-03 13:38:47

标签: objective-c macos cocoa unicode character-encoding

我有NSString unicode代码点范围,它代表NSString中文本的特定部分。由于NSString中的字符代码点并不一一对应,我需要以某种方式将我的代码点范围转换为相应的字符范围。我该怎么做?

I know I can use NSString方法-rangeOfComposedCharacterSequencesForRange:将字符范围转换为字形集群范围,但我想要做的是与此相反,我不能在API中找到该方法的反转。即使有这样的方法可用,我也不认为这正是我正在寻找的,因为(如果我理解正确的话)字形集群与a不同 unicode代码点,实际上可以由多个代码点组成。

1 个答案:

答案 0 :(得分:1)

你所拥有的是来自两个不同世界的混合数据。您通常可以获得Unicode代码点范围以及UTF-32字符串(其中对应关系是一对一的),因此提取子字符串将是微不足道的。您有两种选择:

  1. 在将数据放入NSString
  2. 之前,在UTF-32世界中工作
  3. 将Unicode代码点范围转换为UTF-16单位范围
  4. 我从你的问题中假设#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
    }