将UTF-16数字转换为UTF-8?

时间:2013-04-30 17:36:38

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

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

我的问题分为三部分:

  • 有没有办法判断这个数字是UTF-8还是UTF-16?
  • 如果数字是数字,我如何从UTF-16转换为UTF-8?
  • 看了之后什么都没找到,有人知道关于这个问题的好论文吗? (在iOS中来回转换)。

2 个答案:

答案 0 :(得分:2)

  

我可以告诉你这个号码是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

答案 1 :(得分:1)

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

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

  

我可以告诉你这个号码是UTF-8还是UTF-16?

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

  

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

最好使用经过测试的Unicode库,如ICU。此外libiconv可能对您有用,但请注意许可。