【问题标题】:Convert UTF-16 numbers to UTF-8?将 UTF-16 数字转换为 UTF-8?
【发布时间】:2013-04-30 17:36:37
【问题描述】:

我有一个 iPad 应用程序,用户可以在其中在文本字段中输入电话号码。有时电话号码以 UTF-16 格式输入(日语有时以这种方式输入他们的电话号码),但大部分时间以 UTF-8 格式输入。

我的问题分为三个部分:

  • 有什么方法可以判断数字是 UTF-8 还是 UTF-16?
  • 如果数字是数字,我如何从 UTF-16 转换为 UTF-8?
  • 看了一无所获,有人知道关于这个主题的好论文吗? (在 iOS 中来回转换)。

【问题讨论】:

  • 如果用户将号码输入到UITextField,那么您有一个NSString。用户如何以不同的编码输入这个字符串?这没有任何意义。您可以使用您想要的任何编码将NSString 转换为NSData,但用户在输入文本字段期间无法控制编码。
  • “数字是以 UTF-16 或 UTF-8 输入”是什么意思?
  • @MartinR:UTF-16 编码的字节流每个代码点至少使用 2 个字节,而 UTF-8 可以低至每个代码点一个字节。
  • @datenwolf:我知道 UTF-8 和 UTF-16,但我不明白这如何应用于使用 NSString 的文本字段(正如 rmaddy 在他的评论中所指出的那样)。
  • 我了解其中的区别......我只是被提供应用程序规格的人告诉这个......

标签: ios objective-c utf-8 utf-16


【解决方案1】:

有什么方法可以判断数字是 UTF-8 还是 UTF-16?

没有。 NSString 没有公开这个实现细节。你不应该需要它。 (如果这样做,那很可能是设计错误。)

如果数字是数字,我如何从 UTF-16 转换为 UTF-8?

(数字数字,还是我遗漏了什么?)好吧,您可以使用NSString作为一种“桥梁”在不同编码的C字符串(字符数组)之间进行转换:

unichar utf16_string[] = // some UTF-16 C string
NSString *tmp = [[NSString alloc] initWithBytes:utf16_string
   length:sizeof(utf16_string) / sizeof(utf16_string[0])
   encoding:NSUTF16StringEncoding
];
const char *utf8_string = [tmp UTF8String];

看了一无所获,有人知道关于这个主题的好论文吗?

NSString class reference

【讨论】:

    【解决方案2】:

    所有 Unicode 编码都可以毫无问题地相互转换。 UTF-8 只是与 UTF-16 相同的另一种编码。东亚用户比 UTF-8 更频繁地使用 UTF-16 的主要原因是,用 UTF-16 对东亚 Unicode 平面的代码点进行编码更节省空间。

    Unicode 编码之间的转换或多或少是直截了当的:Unicode 为每个字符分配一个代码点。代码点以特定编码方式编码为字节流。所以你必须做的就是将 UTF-16 字节流解码为单个 Unicode 代码点,然后将它们反向转换为 UTF-8 编码的字节流。

    有什么方法可以判断数字是 UTF-8 还是 UTF-16?

    这不是你要找的。你想知道字符串的编码。

    如何从 UTF-16 转换为 UTF-8

    最好使用经过测试的 Unicode 库,例如 ICUlibiconv 也可能对您有用,但请注意许可证。

    【讨论】:

    • 我相信libiconv默认安装在iOS上,至少工具链的sysroot中有一个iconv.dylib文件。另外,NSString 本身不能像我描述的那样处理转换吗?
    猜你喜欢
    • 2015-09-21
    • 2015-09-19
    • 1970-01-01
    • 2017-09-24
    • 2013-05-20
    • 2012-06-30
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多