use*_*093 4 vim character-encoding dictionary
我尝试转换的 .dsl 格式的字典文件有一些特殊之处。它本质上是一个带有字典对的文本文件。我使用的词典软件是GoldenDict。它需要 UTF-16 字典才能正确呈现。
\n我拥有的所有词典都是 UTF-16LE 格式。然而,有一个很突出。它具有 iso-8859-1 编码。当我用 vim 打开条目时,它看起来像这样:
\nabandonarse\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然后我尝试:
\niconv -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您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)