Vim
如何正確地將文件轉換為 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
Goldendict 正確渲染了新的 test.dsl 字典,但是我可以看到一些我想擺脫的奇怪的東西。首先是剛剛轉換的文件的編碼不像其他字典那樣被辨識:
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。我想讓這個文件不顯示 ^@ 字元,因為我可能需要手動編輯字典中的一些標題。
您
vim
尚未辨識編碼,並將 16 位字元顯示為 8 位字元。^@
標記代表高階 8 位,對於常見的拉丁字元,其值為零。你可以在讀入文件後輸入這個來強制辨識 UTF-16LE
:e ++enc=utf-16le
(信用:堆棧溢出)
似乎這也行得通,但它是否理想對我來說還很不清楚
vim -c 'e ++enc=utf-16le' dictionary.dsl
最後,從您的評論看來,BOM似乎是完全可以接受的。您不能使用
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