【问题标题】:Converting UTF-16 to UTF-8 using libiconv使用 libiconv 将 UTF-16 转换为 UTF-8
【发布时间】:2013-05-20 00:05:33
【问题描述】:

我正在尝试将 UTF-16 字符串转换为 utf-8 并碰壁。输出字符串包含字符但有空格!?输入是hi\0,如果我查看输出,它会显示h\0i\0 而不是hi\0

你看到这里的问题了吗?非常感谢!

size_t len16 = 3 * sizeof(wchar_t);
size_t len8 = 7;
wchar_t utf16[3] = { 0x0068, 0x0069, 0x0000 }, *_utf16 = utf16;
char utf8[7], *_utf8 = utf8;

iconv_t utf16_to_utf8 = iconv_open("UTF-8", "UTF-16LE");
size_t result = iconv(utf16_to_utf8, (char **)&_utf16, &len16, &_utf8, &len8);

printf("%d - %s\n", (int)result, utf8);

iconv_close(utf16_to_utf8);

【问题讨论】:

  • 我会说 UTF-16 需要 2 字节代码单元(即 uint16_tchar16_t),而您的 wchar_t 具有不同的大小。 [Nitpicker 的注意:iconv 是 Posix 函数,Posix 要求 CHAR_BIT == 8。]
  • @KerrekSB 这似乎是问题所在!谢谢,我很乐意接受您的回答。

标签: c character-encoding libiconv


【解决方案1】:

iconv 的输入数据始终是不透明的字节流。读取 UTF-16 时,iconv 期望输入数据由两字节代码单元组成。因此,如果要提供硬编码的输入数据,则需要使用两字节宽的整数类型。

在 C++11 和 C11 中,这应该是 char16_t,但你也可以使用 uint16_t

uint16_t data[] = { 0x68, 0x69, 0 };

char const * p = (char const *)data;

为了迂腐,一般来说没有什么说uint16_t 有两个字节。但是,iconv 是 Posix 库,而 Posix 强制要求 CHAR_BIT == 8,所以在 Posix 上也是如此。

(另请注意,您拼写文字值的方式与您使用该值初始化的类型的宽度没有任何关系,因此0x680x0068 之间没有区别,或0x00068。更有趣的是新的Unicode字符文字\u\U,但这是一个完整的different story。)

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2015-09-19
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2019-05-15
    • 2010-10-19
    • 2012-06-30
    相关资源
    最近更新 更多