我希望在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。
答案 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/)。