Objective-C如何获得unicode字符

时间:2011-01-18 16:42:35

标签: objective-c unicode

我希望在Objective-C中获得给定unicode字符的unicode代码点。 NSString称其内部使用UTF-16编码并表示,

  

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

这似乎假设characterAtIndex方法是unicode意识。但是它返回unichar是一个16位无符号int类型。

- (unichar)characterAtIndex:(NSUInteger)index

问题是:

  • Q1:如何在UFFFF上方显示unicode代码点?

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

THX。

2 个答案:

答案 0 :(得分:3)

简短回答“Q1:它如何呈现UFFFF上方的unicode代码点?”是:您需要UTF16知道并正确处理Surrogate Code Points。下面的信息和链接应该为您提供指针和示例代码,允许您执行此操作。

NSString文档是正确的。但是,虽然你说“NSString说它内部使用UTF-16编码”,但更准确地说NSString的公共/抽象接口是基于UTF16的。不同之处在于,这会使字符串的内部表示形成私有实现细节,但characterAtIndex:length等公共方法始终位于UTF16

这样做的原因是它倾向于在旧的ASCII - 中心和Unicode识别字符串之间取得最佳平衡,主要是因为Unicode是ASCII的严格超集({{1}使用7位,128个字符,映射到前128个Unicode代码点。

表示>的Unicode Code Points ASCII,明显超出单U+FFFF Code Unit中可以表示的内容,UTF16使用特殊Surrogate Code Points形成Surrogate Pair,组合在一起形成Unicode代码点> UTF16。您可以在以下网址找到相关详细信息:

答案 1 :(得分:2)

来自length的文档:

  

返回的号码包括   作文的个性   字符序列,所以你不能使用   此方法确定是否为字符串   将在打印或如何显示时显示   很久它会出现。

由此,我推断U + FFFF以上的任何字符都将被计为两个字符,并将被编码为代理对(请参阅http://unicode.org/glossary/处的相关条目)。

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