【问题标题】:NSString and unichar don't match well when it comes to UnicodeNSString 和 unichar 在 Unicode 方面不太匹配
【发布时间】:2012-06-13 19:46:13
【问题描述】:

Apple 的 documentation 声明

字符串对象被实现为 Unicode 字符数组

但是,unichar 数据类型的大小(在幕后很可能是unsigned short)只有 16 位,这导致无法用unichar 表示每个 Unicode 字符。我如何在脑海中调和这两个事实?

【问题讨论】:

  • 也许你应该解释一下为什么你认为这是不可能的。
  • 大多数时候,NSString 使用底层 UTF-8 字符串,而不是 UTF-16,除非您特别使用 UTF-16 创建它。

标签: objective-c string unicode character-encoding


【解决方案1】:
  1. 不确定字符串是否由unichar 数据类型表示。 “一个字符串对象被实现为一个 Unicode 字符数组”并不意味着它在源代码中存储为unichar *。你不知道它是如何实现的,是吗?
  2. 如果unichar 不是一个无符号短呢?如果它是 32 位或 64 位数据类型怎么办?

【讨论】:

  • Unicode 字符的大小是不是有点奇怪……比如 20 位或类似的东西? (实际上是留下一些尾随零)
  • 没有。 UTF8 是 8 位或 16 位或 24 位或 32 位; UTF-16 是 16 位的; UTF-32 是 32 位的。
  • 亲自查看sizeof(unichar) 评估的数字或查看此 SO 问题:stackoverflow.com/questions/1092695/objective-c-unichar-vs-char
  • 好吧——在大多数系统上,它可能是一个无符号短。但它特定于实现的,你必须坚持它。
  • @H2CO3 好吧,UTF 只是一组编码。所有 unicode 字符(是的,我也包括表情符号)实际上需要 21 位才能适应。
【解决方案2】:

您是正确的,Apple 的文档错误地引用了 Unicode 字符,而它实际上是指 UTF-16 代码点。

在 Unicode 的早期,人们希望它不会超过 16 位,但它确实做到了。 Apple 和 Microsoft(可能还有其他公司)都使用 16 位整数来表示“Unicode 字符”,即使某些字符必须由代理对表示。

NSString 的各种方法处理这种情况(加上组合字符)并返回给定字符的范围。例如。 -rangeOfCharacterFromSet:...-rangeOfComposedCharacterSequences...

【讨论】:

  • 那么,这是否意味着文档对 Unicode 过于自信,而 NSString 的实现目前在内部(最多)使用 UTF-16 编码,因此无法包含埃及象形文字?跨度>
  • 嗯?是什么让你认为 UTF-16 不能代表所有的 Unicode?​​span>
  • 你是对的,它可以 :*) 但猜猜我在想的是,人们需要使用 unichar 以外的其他东西来存储 Unicode 的 BMP 中的字符以提供 NSString对吧?
  • 您需要使用unichars 的序列(即数组),就像+[NSString stringWithCharacters:length:]-[NSString initWithCharacters:length:] 接受的一样。或者,当然,您可以在NSData 的数组中使用给定编码的字节序列-initWithBytes:length:encoding:-initWithData:encoding:
  • @ken - 认为文档在哪里不正确?我没看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多