linux – 使用iconv将UTF8转换为UTF16

当我使用iconv从UTF16转换为UTF8时,一切都很好,反之亦然,它不起作用。
我有这些文件:

a-16.strings:    Little-endian UTF-16 Unicode c program text
a-8.strings:     UTF-8 Unicode c program text, with very long lines

编辑器中的文本看起来很好。当我运行这个:

iconv -f UTF-8 -t UTF-16LE a-8.strings > b-16.strings

然后我得到这个结果:

b-16.strings:    data
a-16.strings:    Little-endian UTF-16 Unicode c program text
a-8.strings:     UTF-8 Unicode c program text, with very long lines

文件实用程序不显示预期的文件格式,文本在编辑器中看起来也不好看。 iconv是不是可以创建正确的BOM?我在MAC命令行运行它。

为什么b-16不是正确的UTF-16LE格式?是否有另一种方式将utf8转换为utf16?

更多的细节是下面。

$ iconv -f UTF-8 -t UTF-16LE a-8.strings > b-16le-BAD-fromUTF8.strings
$ iconv -f UTF-8 -t UTF-16 a-8.strings > b-16be.strings 
$ iconv -f UTF-16 -t UTF-16LE b-16be.strings > b-16le-BAD-fromUTF16BE.strings

$ file *s
a-16.strings:                   Little-endian UTF-16 Unicode c program text, with very long lines
a-8.strings:                    UTF-8 Unicode c program text, with very long lines
b-16be.strings:                 Big-endian UTF-16 Unicode c program text, with very long lines
b-16le-BAD-fromUTF16BE.strings: data
b-16le-BAD-fromUTF8.strings:    data


$ od -c a-16.strings | head
0000000  377 376   /  \0   *  \0      \0  \f 001   E  \0   S  \0   K  \0

$ od -c a-8.strings | head 
0000000    /   *   *   *       Č  **   E   S   K   Y       (   J   V   O

$ od -c b-16be.strings | head
0000000  376 377  \0   /  \0   *  \0   *  \0   *  \0     001  \f  \0   E

$ od -c b-16le-BAD-fromUTF16BE.strings | head                                
0000000    /  \0   *  \0   *  \0   *  \0      \0  \f 001   E  \0   S  \0

$ od -c b-16le-BAD-fromUTF8.strings | head
0000000    /  \0   *  \0   *  \0   *  \0      \0  \f 001   E  \0   S  \0

很明显,当我运行转换为UTF-16LE时,BOM丢失。
有什么帮助吗?

UTF-16LE告诉iconv生成没有BOM(字节顺序标记)的小端UTF-16。显然,它假设由于您指定LE,BOM不是必需的。

UTF-16告诉它使用BOM生成UTF-16文本(以本地机器的字节顺序)。

如果你是一个小端的机器,我没有看到一种方法告诉iconv生成一个BOM的大端UTF-16,但我可能只是缺少一些东西。

我发现file命令不能识别没有BOM的UTF-16文本,编辑器也可能不会。但是,如果您运行的是iconv -f UTF-16LE -t UTF_8 b-16字符串,则应该获得原始文件的有效UTF-8版本。

尝试在文件上运行od -c以查看其实际内容。

更新:

看起来你是一个大端机(x86是小端),你正在尝试用BOM生成一个小端UTF-16文件。那是对的吗?据我所知,iconv不会直接做到这一点。但这应该是有效的:

( printf "\xff\xfe" ; iconv -f utf-8 -t utf-16le UTF-8-FILE ) > UTF-16-FILE

printf的行为可能取决于您的区域设置;我有LANG = en_US.UTF-8。

(任何人都可以建议一个更优雅的解决方案?)

另一种解决方法,如果你知道由-t utf-16产生的输出的字节顺序:

iconv -f utf-8 -t utf-16 UTF-8-FILE | dd conv=swab 2>/dev/null
翻译自:https://stackoverflow.com/questions/8923866/convert-utf8-to-utf16-using-iconv

转载注明原文:linux – 使用iconv将UTF8转换为UTF16