受这个问题的启发,我可以使用该iconv
命令生成具有BOM表和指定字节序的UTF-16输出吗?
该iconv
命令将文本从一种编码转换为另一种编码。
例如:
echo hello | iconv -f ascii -t utf-16
生成的UTF-16表示形式"hello\n"
。
UTF-16文件通常但不总是以字节顺序标记(BOM)开头,它是Unicode字符的2字节编码U+FEFF
。您可以通过检查前两个字节是FE FF
还是来确定带有BOM的UTF-16文件的字节序FF FE
。
该iconv
命令具有用于生成UTF-16输出的几个选项:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
该命令:
echo hello | iconv -f ascii -t utf-16be
生成没有BOM的 big-endian UTF-16 ;似乎假设如果指定了字节序,则无需在输出中指出。同样,utf-16le
生成不带BOM的小端序UTF-16。
这个:
echo hello | iconv -f ascii -t utf-16
生成(在我的x86 Ubuntu系统上)带有 BOM的小尾数UTF-16 -但是我已经看到了类似的命令的报告,即使在小尾数系统上也生成带有BOM的大尾数UTF-16。
我总是可以手动使用utf-16be
或utf-16le
在BOM表前面添加,但是我正在寻找仅使用iconv
命令的解决方案。
如果您知道字节序会-t utf-16
产生什么,则另一个解决方法是:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
我会喜欢到使用是一样的东西:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
但iconv
不支持。
编辑:
有权访问x86 Mac OSX系统的人可以发表评论,显示以下命令的(复制并粘贴)输出吗?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- 的方式,并想知道为什么-t utf-16
似乎没有保留字节序。
iconv -f UTF-8 -t UTF-16
,它在低端系统(MacOS)上运行,生成带有BOM的大端UTF-16,这似乎很奇怪。