有人能告诉我如何在Objective-C中将UTF-8值转换为UCS-2值吗?

3
我正在尝试将UTF-8字符串转换为UCS-2字符串。 我需要获取类似于"\uFF0D\uFF0D\u6211\u7684\u4E0A\u7F51\u4E3B\u9875"的字符串。 我已经谷歌了一个月了,但仍然没有关于将UTF-8转换为UCS-2的参考资料。 请有人帮帮我。 提前致谢。
编辑:好吧,也许我的解释不够好。这就是我要做的事情。 我住在韩国,正在尝试使用CTMessageCenter发送短信消息。我尝试通过我的应用程序发送简体中文字符。但是我得到的是????而不是正确的字符。因此,我也尝试了UTF-8、UTF-16、BE和LE。但它们都返回??。最后,我发现短信在韩国使用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 或字符串字面量吗? - Codo
我需要UCS-2编码及其字符串字面值。 - Joshua Son
UCS-2基本上与UTF-16相同。 - Hot Licks
当然,Objective-C字符串中的字符是UTF-16。 - Hot Licks
2个回答

2

维基百科:

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

IBM:

由于 UCS-2 标准仅限于 65,535 个字符,并且数据处理行业需要超过 94,000 个字符,因此 UCS-2 标准正在被 Unicode UTF-16 标准取代。

但是,由于 UTF-16 是现有 UCS-2 标准的超集,因此只要应用程序将 UCS-2 视为 UTF-16 进行处理,就可以使用系统现有的 UCS-2 支持来开发应用程序。

Unicode.org:

UCS-2 是过时的术语,指的是 Unicode 实施直到 Unicode 1.1,在版本 2.0 中增加代理代码点和 UTF-16 之前。现在应避免使用此术语。

UCS-2 不定义一个独立的数据格式,因为对于数据交换而言,UTF-16 和 UCS-2 是相同的。两者都是 16 位,并且具有完全相同的码单元表示。

因此,在大多数语言库中使用“UTF8toUnicode”转换将产生 UTF-16,这本质上就是 UCS-2。从 Objective-C 字符串中简单提取 16 位字符即可实现相同的效果。

换句话说,解决方案一直在你面前。


UTF8toUnicode 不是一个有意义的函数名称,因为 UTF-8 已经是 Unicode。这听起来像是一些愚蠢的 Microsoft bug。 - tchrist
我是在使用它作为一个通用术语。大多数语言库将UTF-16称为“Unicode”。 - Hot Licks
我也已经使用Unicode超过十年了,"Unicode"是Java最初对UTF-16的称呼。当Unicode最初被发明时,UTF-32并不存在,从实际意义上讲,无论是否"正确","Unicode"和"UTF-16"都被视为可以互换的术语。 - Hot Licks

0

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

因此,将 UTF-8 转换为 UCS-2 是不可能的,反之亦然。

UCS-2 已经过时,是古老的历史。让它安息吧。


虽然并非所有的UTF-8字符串都可以转换为UCS-2,但实际上许多字符串可以。此外,许多系统和字符串库支持多种处理无法转换为不同编码的字符的方法。虽然不可能将所有UTF-8字符串转换为ISO-8859-1,但在实践中这是必需的,并且经常进行。你的回答有点苛刻。 - Codo
@Codo:你说得很对,将UTF-8转换为Latin1与将UTF-8转换为UCS-2一样没有意义,因为两者都不是有效的Unicode编码。然而,所有的Latin1代码点都可以表示为有效的UTF-8。这在UCS-2中并不成立。这不是一个对称的情况。我看不出苹果iOS文件系统使用UCS-2的任何地方。它似乎以一种混杂的、不完全符合NFD的形式使用UTF-16。这个问题暴露了模糊的思维,对Unicode的概念不清楚。 - tchrist
1
我认为你的观点完全偏离了。我的意图是找出如何从UTF-8转换为UCS-2,而且在C#或其他语言中仍有许多方法可以实现。 - Joshua Son
@Joshua 真的吗?那请将UTF-8字节序列"\xF0\x9F\x92\xA9"转换为UCS-2。注意该代码点的名称。祝你好运,祝你有愉快的一天。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接