Text-Processing
如何測試文本文件的編碼……它是否有效,它是什麼?
我有幾個在Gedit
.htm
中打開的文件沒有任何警告/錯誤,但是當我在 中打開這些相同的文件時,它會警告我無效的 UTF-8 編碼……Jedit
HTML 元標記聲明“charset=ISO-8859-1”。Jedit 允許備份編碼列表和編碼自動檢測器列表(目前為“BOM XML-PI”),因此我的直接問題已經解決。但這讓我想到:如果元數據不存在怎麼辦?
當編碼資訊不可用時,是否有一個 CLI 程序可以“最佳猜測”哪些編碼可能適用?
而且,儘管這是一個略有不同的問題;是否有一個 CLI 程序可以測試已知編碼的有效性?
該
file
命令對編碼進行“最佳猜測”。使用-i
參數強制file
列印有關編碼的資訊。示範:
$ file -i * umlaut-iso88591.txt: text/plain; charset=iso-8859-1 umlaut-utf16.txt: text/plain; charset=utf-16le umlaut-utf8.txt: text/plain; charset=utf-8
這是我創建文件的方式:
$ echo ä > umlaut-utf8.txt
現在一切都是utf-8。但要說服自己:
$ hexdump -C umlaut-utf8.txt 00000000 c3 a4 0a |...| 00000003
與https://en.wikipedia.org/wiki/Ä#Computer_encoding比較
轉換為其他編碼:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt $ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
檢查十六進制轉儲:
$ hexdump -C umlaut-iso88591.txt 00000000 e4 0a |..| 00000002 $ hexdump -C umlaut-utf16.txt 00000000 ff fe e4 00 0a 00 |......| 00000006
通過混合所有三個來創建“無效”的東西:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
什麼
file
說:$ file -i * umlaut-iso88591.txt: text/plain; charset=iso-8859-1 umlaut-mixed.txt: application/octet-stream; charset=binary umlaut-utf16.txt: text/plain; charset=utf-16le umlaut-utf8.txt: text/plain; charset=utf-8
沒有
-i
:$ file * umlaut-iso88591.txt: ISO-8859 text umlaut-mixed.txt: data umlaut-utf16.txt: Little-endian UTF-16 Unicode text, with no line terminators umlaut-utf8.txt: UTF-8 Unicode text
該
file
命令不知道“有效”或“無效”。它只是看到一些字節並試圖猜測編碼可能是什麼。作為人類,我們可能能夠辨識出一個文件是一個文本文件,其中包含一些“錯誤”編碼的元音變音。但作為一台電腦,它需要某種人工智慧。有人可能會爭辯說,啟發式算法
file
是某種人工智慧。然而,即使是這樣,它也是非常有限的。以下是有關該
file
命令的更多資訊:http ://www.linfo.org/file_command.html