Text-Processing

如何測試文本文件的編碼……它是否有效,它是什麼?

  • March 24, 2021

我有幾個在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

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