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

use*_*093 4 vim character-encoding dictionary

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

\n

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

\n
abandonarse\n    [m2][c crimson][b]Sin\xc3\xb3nimos[/b][/c][/m]\n    [m2][i][c green]verbo[/c][/i][/m]\n    [m1][trn][b]desanimarse:[/b] <<desanimarse>>, <<abatirse>>, <<tumbarse>>, <<plegarse>>, <<entregarse>>, <<desligarse>>[/trn][/m]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
iconv -f iso-8859-1 -t utf-16le dictionary.dsl -o test.dsl\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    aleksandr@desktop:~/windoc/Dic/Es extra/dictionary.dsl> file dictionary.dsl\ndictionary: data\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    ^@<^@<^@e^@n^@t^@r^@e^@g^@a^@r^@s^@e^@>^@>^@,^@ ^@<^@<^@d^@e^@s^@l^@i^@g^@a^@r^@s^@e^@>^@>^@[^@/^@t^@r^@n^@]^@[^@/^@m^@]^@\n^@      ^@[^@m^@2^@]^@[^@c^@ ^@c^@r^@i^@m^@s^@o^@n^@]^@[^@b^@]^@A^@n^@t^@\xc3\xb3^@n^@i^@m^@o^@s^@[^@/^@b^@]^@[^@/^@c^@]^@[^@/^@m^@]^@\n^@      ^@[^@m^@2^@]^@[^@i^@]^@[^@c^@ ^@g^@r^@e^@e^@n^@]^@v^@e^@r^@b^@o^@[^@/^@c^@]^@[^@/^@i^@]^@[^@/^@m^@]^@\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
%s/<Ctrl-V><Ctrl-J>//g\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

roa*_*ima 6

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

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

:e ++enc=utf-16le
Run Code Online (Sandbox Code Playgroud)

(来源:StackOverflow

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

vim -c 'e ++enc=utf-16le' dictionary.dsl
Run Code Online (Sandbox Code Playgroud)

最后,从您的评论来看, BOM似乎是可以接受的。您无法使用iconv添加 BOM,但可以自行添加

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

确认

file dictionary-utf16le.dsl
dictionary-utf16le.dsl: Little-endian UTF-16 Unicode text
Run Code Online (Sandbox Code Playgroud)