在 bash 中,我可以hello
通过执行以下操作将字符串的十六进制转储为 UTF-16:
$ echo -n "hello" | iconv -f ascii -t utf-16 | hexdump
0000000 feff 0068 0065 006c 006c 006f
000000c
我也可以像这样编写一个简短的 C 程序:
int main(int argc, char **argv) {
char *str = argv[1];
hexDump("The string", str, 12);
return 0;
}
使用如何获取结构数据的 hexdump 中hexDump
的例程。是我从上面的使用中计算出来的字节数。12
hexdump
编译并运行:
$ gcc test.c -o test
$ ./test $(echo -n hello | iconv -f ascii -t utf-16)
The string:
0000 ff fe 68 65 6c 6c 6f 00 53 53 48 5f ..hello.SSH_
feff 0068 0065 006c 006c 006f
为什么第一个 hexstring和第二个 hexstring之间有区别ff fe 68 65 6c 6c 6f 00 53 53 48 5f
?
我之所以问这个问题是因为我正在尝试调试一个libiconv
用于将 UTF-16 字符串转换为 UTF-8 的应用程序,并不断得到其中的一个errno
,EILSEQ
这意味着libiconv
遇到了“无效的多字节序列”。
更新:
如果我使用 运行hexdump
,-C
我会得到以下输出:
$ echo -n hello | iconv -f ascii -t utf-16 | hexdump -C
00000000 ff fe 68 00 65 00 6c 00 6c 00 6f 00 |..h.e.l.l.o.|
0000000c
这个十六进制字符串仍然与我的 C 程序生成的不同,因为它包含\x00
散布在 ascii 字符之间的字节。但是,当我运行 C 程序时,根本没有\x00
散布任何字节。它只有ff fe
标题,然后是常规的 ascii 字符。