Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何将unicode代码点范围转换为NSString字符范围?_Objective C_Macos_Cocoa_Unicode_Character Encoding - Fatal编程技术网

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

Objective c 如何将unicode代码点范围转换为NSString字符范围?,objective-c,macos,cocoa,unicode,character-encoding,Objective C,Macos,Cocoa,Unicode,Character Encoding,我有一个NSString和一个unicode代码点范围,表示该NSString中文本的特定部分。由于NSString中的字符与代码点不一一对应,因此我需要以某种方式将代码点范围转换为相应的字符范围。我该怎么做 NSString方法-rangeOfComposedCharacterSequencesForRange:将字符范围转换为grapheme集群范围,但我想做的是与之相反的事情,在API中找不到该方法的反面。即使有这样一种方法可用,我也不认为这正是我所要寻找的,因为(如果我理解正确的话)一个

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


NSString
方法
-rangeOfComposedCharacterSequencesForRange:
将字符范围转换为grapheme集群范围,但我想做的是与之相反的事情,在API中找不到该方法的反面。即使有这样一种方法可用,我也不认为这正是我所要寻找的,因为(如果我理解正确的话)一个字形集群与一个unicode代码点不是一回事,事实上它可以由多个代码点组成。

您拥有的是来自两个不同世界的混合数据。通常,您可能会得到一个Unicode代码点范围和一个UTF-32字符串(其中对应关系是一对一的),因此提取子字符串将是很简单的。您有两个选择:

  • 在将数据放入NSString之前,请先在UTF-32环境中工作
  • 将Unicode代码点范围转换为UTF-16单位范围
  • 根据你的问题,我认为#2是你最简单的选择

    正如您所说,NSString中的字符与Unicode代码点不一一对应,因为NSString字符是UTF-16单元。但是,Unicode代码点正好对应NSString中的1或2个字符。通过迭代NSString字符并计算Unicode代码点,您可以非常轻松地编写自己的范围转换例程。由于有效的BMP字符、前导代理和尾迹代理是不相交的,所以您甚至不关心UTF-16数据的尾数,这使得这一点变得更加容易。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
    }