【问题标题】:Can anyone tell me how to convert UTF-8 value to UCS-2 value in Objective-c?谁能告诉我如何在 Objective-c 中将 UTF-8 值转换为 UCS-2 值?
【发布时间】:2011-08-06 13:52:07
【问题描述】:

我正在尝试将 UTF-8 字符串转换为 UCS-2 字符串。 我需要得到像“\uFF0D\uFF0D\u6211\u7684\u4E0A\u7F51\u4E3B\u9875”这样的字符串。 到目前为止,我已经用谷歌搜索了大约一个月,但仍然没有关于将 UTF-8 转换为 UCS-2 的参考。 请有人帮助我。 提前谢谢。

编辑:好吧,也许我的解释不够好。这是我想要做的。 我住在韩国,我正在尝试使用 CTMessageCenter 发送短信。我试图通过我的应用程序发送简体中文。我得到了????而不是正确的字符。所以我也尝试了 UTF-8、UTF-16、BE 和 LE。但是他们都回来了???。最后我发现 SMS 在韩国使用 UCS-2 和 EUC-KR 编码。很奇怪,不是吗? 无论如何,我尝试发送像 \u4E3B\u9875 这样的字符串并且它有效。 所以我需要先将字符串转换为 UCS-2 编码,然后从这些字符串中获取字符串字面量。

【问题讨论】:

  • "\uFF0D\uFF0D\u6211\u7684\u4E0A\u7F51\u4E3B\u9875" 不是 UCS-2 字符串。相反,它是一个 C 或 Objective-C 字符串文字,使用 \u 转义序列来包含由其 Unicode 代码点指定的字符。你真的需要 UCS-2 还是字符串文字?
  • 我需要 UCS-2 编码及其字符串字面量。
  • UCS-2 本质上与 UTF-16 相同。
  • 当然,Objective-C 字符串中的字符是 UTF-16。

标签: ios objective-c unicode utf-8 ucs2


【解决方案1】:

Wikipedia:

较旧的 UCS-2(2 字节通用字符集)是一个类似的 在 2.0 版本中被 UTF-16 取代的字符编码 1996 年 7 月的 Unicode 标准。2 它产生一个固定长度的格式 通过简单地使用代码点作为 16 位代码单元并产生 对于 96.9% 的所有代码点,结果与 UTF-16 完全相同 范围 0-0xFFFF,包括所有已分配 当时的价值。

IBM:

由于 UCS-2 标准限制为 65,535 个字符,并且数据 加工行业需要超过 94,000 个字符,UCS-2 标准 正在被 Unicode UTF-16 标准取代。

但是,由于 UTF-16 是现有 UCS-2 标准的超集, 您可以使用现有的 UCS-2 系统开发您的应用程序 只要您的应用程序将 UCS-2 视为 UTF-16。

uincode.org:

UCS-2 是过时的术语,指的是 Unicode 最高 Unicode 1.1 的实现,在代理代码点和 UTF-16 被添加到标准的 2.0 版中。这个词现在应该 避免。

UCS-2 没有定义不同的数据格式,因为 UTF-16 和 UCS-2 出于数据交换的目的是相同的。两者都是 16 位的,并且具有 完全相同的代码单元表示。

因此,在大多数语言库中使用“UTF8toUnicode”转换将生成 UTF-16,本质上是 UCS-2。并且简单地从 Objective-C 字符串中提取 16 位字符将完成同样的事情。

换句话说,解决方案一直盯着你。

【讨论】:

  • UTF8toUnicode 不是一个有意义的函数名,因为 UTF-8 已经是 Unicode。对我来说,这听起来像是微软的一些愚蠢的错误。
  • 我用它作为一个通用术语。大多数语言库将 UTF-16 称为“Unicode”。
  • 我也使用 Unicode 十多年了,“Unicode”是 Java 最初对 UTF-16 的称呼。当 Unicode 最初被发明时,UTF-32 并不存在,出于所有意图和目的,无论它是否“正确”,“Unicode”和“UTF-16”都被视为可互换的术语。
【解决方案2】:

UCS-2 不是有效的 Unicode 编码。 UTF-8 是。

因此,将 UTF-8 转换为 UCS-2 是不可能的——事实上,反过来也是如此。

UCS-2 已死,历史悠久。让它安静地腐烂吧。

【讨论】:

  • 虽然并非所有 UTF-8 字符串都可以转换为 UCS-2,但实际上很多都可以。此外,许多系统和字符串库支持多种处理无法转换为不同编码的字符的方法。也不可能将所有 UTF-8 字符串转换为 ISO-8859-1,但在实践中经常需要并且经常这样做。你的回答有点苛刻。
  • @Codo:您说得很好,将 UTF-8 转换为 Latin1 与将 UTF-8 转换为 UCS-2 一样没有意义,因为两者都不是有效的 Unicode 编码。但是,所有 Latin1 代码点都可以表示为有效的 UTF-8。 UCS-2 并非如此。这不是一个对称的情况。无论如何,我看不到 Apple ios 文件系统使用 UCS-2。它似乎以一种混蛋的非 NFD 形式使用 UTF-16。这个问题暴露了对 Unicode 概念不清楚的模糊思维。
  • 我觉得你说的有点离题了。我打算做的是找出如何从 UTF-8 转换为 UCS-2。在 C# 或其他语言中仍有很多方法可以做到这一点。
  • @Joshua 哦,真的吗?然后请将 UTF-8 字节序列“\xF0\x9F\x92\xA9”转换为 UCS-2。请注意该代码点的名称。祝你好运,祝你有美好的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2014-09-14
  • 1970-01-01
  • 2011-07-02
  • 2016-08-14
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多