如何正确地将文件转换为 UTF-16LE 编码而不在文件中出现奇怪的字符?

如何正确地将文件转换为 UTF-16LE 编码而不在文件中出现奇怪的字符?

我尝试转换的 .dsl 格式的字典文件有一些特殊之处。它本质上是一个带有字典对的文本文件。我使用的词典软件是GoldenDict。它需要 UTF-16 字典才能正确呈现。

我拥有的所有词典都是 UTF-16LE 格式。然而,有一个很突出。它具有 iso-8859-1 编码。当我用 vim 打开条目时,它看起来像这样:

abandonarse
    [m2][c crimson][b]Sinónimos[/b][/c][/m]
    [m2][i][c green]verbo[/c][/i][/m]
    [m1][trn][b]desanimarse:[/b] <<desanimarse>>, <<abatirse>>, <<tumbarse>>, <<plegarse>>, <<entregarse>>, <<desligarse>>[/trn][/m]

我必须将其转换为 UTF-16LE,因为 Goldendict 呈现一些西里尔字符而不是西班牙重音字符。然后我尝试:

iconv -f iso-8859-1 -t utf-16le dictionary.dsl -o test.dsl

新的 test.dsl 字典由 Goldendict 正确呈现,但是我可以看到一些我想摆脱的奇怪的东西。首先,刚刚转换的文件的编码无法被识别,因为它通常与其他字典一样:

    aleksandr@desktop:~/windoc/Dic/Es extra/dictionary.dsl> file dictionary.dsl
dictionary: data

当我用 vim 打开文件 test.dsl 时,里面的每个字符都添加了 ^@ 。以下是同一条目的示例:

    ^@<^@<^@e^@n^@t^@r^@e^@g^@a^@r^@s^@e^@>^@>^@,^@ ^@<^@<^@d^@e^@s^@l^@i^@g^@a^@r^@s^@e^@>^@>^@[^@/^@t^@r^@n^@]^@[^@/^@m^@]^@
^@      ^@[^@m^@2^@]^@[^@c^@ ^@c^@r^@i^@m^@s^@o^@n^@]^@[^@b^@]^@A^@n^@t^@ó^@n^@i^@m^@o^@s^@[^@/^@b^@]^@[^@/^@c^@]^@[^@/^@m^@]^@
^@      ^@[^@m^@2^@]^@[^@i^@]^@[^@c^@ ^@g^@r^@e^@e^@n^@]^@v^@e^@r^@b^@o^@[^@/^@c^@]^@[^@/^@i^@]^@[^@/^@m^@]^@

我尝试在 vim 中删除这个字符

%s/<Ctrl-V><Ctrl-J>//g

但是,然后我保存文件,它的编码又是 iso-8859-1 。我希望显示的文件不带 ^@ 字符,因为我可能需要手动编辑字典中的一些标题。

答案1

vim尚未识别编码,并将 16 位字符显示为 8 位字符。标记^@代表高阶 8 位,对于常见的拉丁字符来说,其值为零。

您可以在读入文件后键入此内容以强制识别UTF-16LE

:e ++enc=utf-16le

(信用:堆栈溢出

似乎这也可行,但我还不清楚它是否理想

vim -c 'e ++enc=utf-16le' dictionary.dsl

最后,从你的评论似乎一个物料清单是可以接受的。你不能使用iconv添加 BOM 但您可以自己添加一个

(
    printf "%s" $'\xFF\xFE'
    iconv -f iso-8859-1 -t utf-16le dictionary.dsl
) > dictionary-utf16le.dsl

确认

file dictionary-utf16le.dsl
dictionary-utf16le.dsl: Little-endian UTF-16 Unicode text

相关内容