Objective-C如何获取Unicode字符

4
我希望在Objective-C中获取给定Unicode字符的Unicode代码点。NSString表示它内部使用UTF-16编码,并且说:

NSString类有两个原始方法-length和characterAtIndex:-提供了其接口中所有其他方法的基础。length方法返回字符串中Unicode字符的总数。characterAtIndex:通过索引访问字符串中的每个字符,索引值从0开始。

这似乎假定characterAtIndex方法具有Unicode感知能力。但是,它返回的unichar是一个16位无符号整数类型。

- (unichar)characterAtIndex:(NSUInteger)index

问题如下:

  • Q1:如何表示超过UFFFF的unicode代码点?

  • Q2:如果Q1有意义,是否有方法在Objective-C中获取给定Unicode字符的Unicode代码点。

谢谢。

2个回答

3
"Q1: 如何表示大于UFFFF的Unicode代码点?"的简短答案是:您需要了解UTF16并正确处理代理对代码点。下面的信息和链接应该会给您提供指导和示例代码,使您能够做到这一点。 NSString文档是正确的。然而,虽然您说“NSString说它内部使用UTF-16编码”,但更准确的说法是NSString的公共/抽象接口基于UTF16。区别在于,这使得字符串的内部表示成为私有实现细节,但公共方法(如characterAtIndex:length)始终以UTF16表示。
原因是它往往在旧版ASCII中心和支持Unicode的字符串之间取得最佳平衡(主要是因为Unicode是ASCII的严格超集(ASCII使用7位,表示128个字符,这些字符映射到前128个Unicode代码点))。
为了表示大于U+FFFF的Unicode代码点,显然超过了单个UTF16代码单元所能表示的范围,UTF16使用特殊的代理对代码点来形成一个代理对,当它们组合在一起时,形成大于U+FFFF的Unicode代码点。您可以在以下链接中找到有关此内容的详细信息:"

2

根据 length 的文档:

返回的数字包括组成字符序列的单个字符,因此您不能使用此方法确定打印时字符串是否可见或其长度。

根据这一点,我推断出任何U+FFFF以上的字符都将计为两个字符,并将编码为代理对(请参阅http://unicode.org/glossary/中相关条目)。

如果您有一个带有需要转换字符的UTF-32编码字符串,则可以使用initWithBytesNoCopy:length:encoding:freeWhenDone:创建一个新的NSString,并使用其结果确定如何在UTF-16中编码字符。但是,如果您要进行大量Unicode处理,则最好熟悉ICU ( http://site.icu-project.org/ )。


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