誰能解釋這種與編碼相關的行為?

誰能解釋這種與編碼相關的行為?

儘管讀了很多書,但編碼不是我的強項。

我想編輯一個文件,它的擴展名是.tdl,但這並不意味著什麼。

它是一個 XML 檔。第一行如下圖所示:

<?xml version="1.0" encoding="utf-16"?>

當我嘗試使用 gedit 開啟此檔案時,我在黃色背景上收到一條大訊息,內容如下:

“開啟文件時出現問題...您開啟的文件包含一些無效字元。如果繼續編輯此文件,可能會損壞此文件。您也可以選擇其他字元編碼,然後重試”

其下方的字元編碼下拉方塊顯示「目前區域設定 (UTF-8)」。

我嘗試將其設定為“Unicode (UTF-16)”並點擊“重試”。令人討厭的消息又回來了,下拉列表被設定回“當前區域設定(UTF-8)”。

我還嘗試透過檔案 --> 開啟 --> 字元編碼來開啟檔案:從「自動偵測」變更為「Unicode (UTF-16)」。但我再次收到令人討厭的訊息,下拉清單再次設定為「目前區域設定(UTF-8)」。

透過程式設計(使用 Groovy groovy.xml.XMLParser),我能夠解析這個檔案並產生一個看似有效的groovy.util.Node結構。我還沒有達到嘗試保存這個內部 Node 結構的階段,無論是否修改過。

有人可以告訴我這個文件有什麼問題(如果有的話),以及我如何安全地編輯它?

答案1

在 UTF-16 中,字元位於兩個位元組上,對於 ASCII 字符,高位元組為 0x00。

例如 UTF-16 中的「Something」是:

00000000  ff fe 53 00 6f 00 6d 00  65 00 74 00 68 00 69 00  |..S.o.m.e.t.h.i.|
00000010  6e 00 67 00 0a 00                                 |n.g...|

OxFFFE開頭是位元組順序標記,如果您看到 0xFEFF,您就知道必須交換位元組...)。

到處都是 NUL 字元確實會讓軟體感到困惑...

您可以使用以下命令轉換為更合理的 UTF-8 iconv

iconv -f UTF-16 -t UTF-8 <utf16file >utf8file

並且不要忘記更改文件頭中的編碼

答案2

如果檔案是 UTF-16(Windows 典型編碼),那麼您在 Linux 下就會遇到麻煩(UTF-8 原生,激進...)。至少GNU emacs說它支援UTF-16,從來沒有憤怒地使用過它。

您可以嘗試 recode(1) 轉換為 UTF-8(並修復標頭等以匹配),但這可能會嚴重破壞需要 UTF-16 的工具。

更新:只是想到了這一點:重新編碼為UTF-8;閒暇時碾壓、紡錘、污損;重新編碼回 UTF-16。這樣你就可以在中間使用熟悉的工具。但修復已公佈的 UTF-16 編碼,誰知道工具是否會感到困惑。或者也許 XML 修改工具確實注意到了這一點...

相關內容