gpt4 book ai didi

linux - 使用 iconv 将 UTF8 转换为 UTF16

转载 作者:IT王子 更新时间:2023-10-29 00:14:13 26 4
gpt4 key购买 nike

当我使用 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

file 实用程序未显示预期的文件格式,并且文本在编辑器中看起来也不好。会不会是 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 strings,您应该会得到原始文件的有效 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

关于linux - 使用 iconv 将 UTF8 转换为 UTF16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8923866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com