Vim

如何正確地將文件轉換為 UTF-16LE 編碼,而文件中不會出現奇怪的字元?

  • September 9, 2020

我正在嘗試轉換的 .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

引用自:https://unix.stackexchange.com/questions/608452