使用 libiconv 将 UTF-16 转换为 UTF-8

标签 c character-encoding libiconv

我正在尝试将 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);

最佳答案

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 上也是如此。

(另请注意,拼写文字值的方式与使用该值初始化的类型的宽度没有任何关系,因此 0x680x00680x00068。更有趣的是新的 Unicode 字 rune 字 \u\U ,但那是一个整体 different story 。)

关于使用 libiconv 将 UTF-16 转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734103/

相关文章:

c - 如何使用 : "\\" or "\"? 分割字符串

c - 从 int 读取字节以写入 Unicode C

python - 使用Python 3.6读取文件

python - Windows 控制台编码

使用 UTF-16 编码的 R write.csv

macos - libiconv.2.dylib Mac OS X 问题

c - 通过 C 程序管道日志输出以方便日志轮换

c - 使用 SQLite3 和 C 的段错误

android - 如何为 android ndk 安装 libiconv?

gcc - libiconv 和 MacOS