【问题标题】:Objective-C How to get unicode characterObjective-C 如何获取 unicode 字符
【发布时间】:2011-06-11 05:27:12
【问题描述】:

我想在 Objective-C 中获取给定 unicode 字符的 unicode 代码点。 NSString 表示它内部使用 UTF-16 编码并表示,

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

这似乎假设 characterAtIndex 方法是 unicode 感知的。但是它返回的 unichar 是一个 16 位的 unsigned int 类型。

- (unichar)characterAtIndex:(NSUInteger)index

问题是:

  • Q1:如何在 UFFFF 之上呈现 unicode 代码点?

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

谢谢。

【问题讨论】:

    标签: objective-c unicode


    【解决方案1】:

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

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

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

    要表示 Unicode Code Points 即 > U+FFFF,这显然超出了单个 UTF16 Code Unit 所能表示的范围,UTF16 使用特殊的 Surrogate Code Points 来形成 Surrogate Pair,当组合在一起形成一个 Unicode 代码点 > U+FFFF。您可以在以下位置找到有关此内容的详细信息:

    【讨论】:

      【解决方案2】:

      来自length的文档:

      返回的数字包括 组成的单个字符 字符序列,所以你不能使用 这个方法判断一个字符串是否 打印时将可见或如何 它会出现多久。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多