Shell

儲存包含無效字元的文件

  • July 19, 2016

我們從客戶那裡獲得的一些文件無法正確處理,因​​為它們被聲明為 US-ASCII 但包含無效字元。為了驗證軟體修復,我嘗試將原始文件中的幾行複製到一個新文件中。原始文件很大,我只需要幾行。

原始行在 gedit 中看起來像這樣003002002002\D4M\D4紅色部分,我收到有關無效字元的警告。在控制台上,原始行如下所示:003002002002�M

我試圖通過 head & tail 傳輸文件,但生成的文件包含一個“固定”字元而不是無效字元。

head -n 449025 invalid.txt | tail > invalid_short.txt

如果我 cat 結果文件,該行看起來像這樣:003002002002�M 但是如果我用 gedit 打開結果文件,它看起來像這樣:003002002002ÔM並且沒有無效字元

我試圖在 gedit 中選擇行並將它們保存為新文件,但我只得到無效字元的表示,而不是原始字元。cat 和 gedit 看起來像這樣(沒有無效字元警告,沒有紅色):003002002002\D4M

看起來我錯過了一些簡單的東西,但我不知道是什麼。

謝謝

Ubuntu 16.04,zsh

head或者tail不會修復/改變角色。

可能會發生的是gedit嘗試根據前幾個字節猜測文件的編碼。當 0xD4 在文件中很遠時,gedit猜測文件是 ASCII 或 UTF-8 格式,並在看到 ASCII 或 UTF-8 中無效的 0xD4 字節時抱怨。

而對於第二個較短的文件,由於 0xD4 靠近文件的開頭,gedit猜測字元集是一些 8 位字元集(可能是 iso8859-1,其中 0xD4 是 Ô)。

所以你的:

head -n 449025 invalid.txt | tail > invalid_short.txt

方法是正確的。如果你sed -n l在這兩個文件上執行,你會在這兩種情況下看到類似003002002002\324M. 並與hd: 30 30 33 30 30 32 30 30 32 30 30 32 d4 4d |003002002002.M|

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