2012-11-27 47 views
10

我正在寫一個應用程序,它需要一些大量的文本作爲輸入,可以用任何字符編碼,並且我想將它全部保存在UTF-8中。我不會收到或不能信任用數據定義的字符編碼(如果有的話)。在Python中進行編碼檢測,是否使用chardet庫?

我已經使用Pythons庫chardet來檢測原始字符編碼http://pypi.python.org/pypi/chardet,但最近遇到了一些問題,我注意到它不支持斯堪的納維亞編碼(例如iso-8859-1)。 除此之外,它需要大量的時間/ CPU /內存來獲得結果。對於2MB文本文件〜40s。

我嘗試了使用標準的Linux文件

file -bi name.txt 

並與我的所有文件到目前爲止,它爲我提供了100%的結果。這對於一個2MB文件約0.1秒。它也支持斯堪的納維亞字符編碼。

所以,我猜測使用文件的優勢很明顯。有什麼缺點?我錯過了什麼嗎?

+0

如果它是100%準確的,那麼我想知道爲什麼有人不使用'file'使用相同的規則來實現它(或'chardet')... - 你試過一個'file' vs'chardet比較大量的測試數據? –

+0

FWIW,ISO-8859-1(及其修訂版,-15)不僅僅是斯堪的納維亞語,它還用於許多其他基於拉丁語的腳本。如果輸入是「主要是ASCII」而不是UTF-8,ISO-8859-1是一個很好的猜測。 http://en.wikipedia.org/wiki/ISO/IEC_8859#The_Parts_of_ISO.2FIEC_8859 – Thomas

+0

喬恩,我完全同意。因此我的問題。 我無法訪問足夠的數據,這將使這種方法具有統計顯着性,因此不幸的是,您的問題的答案是否定的。 – Niklas9

回答

4

由於不完全標準的encondings,舊的MS-DOS和Windows格式的文件可能被檢測爲unknown-8bit而不是ISO-8859-X。 Chardet將會進行有根據的猜測,報告一個信心值。

http://www.faqs.org/faqs/internationalization/iso-8859-1-charset/

如果你不處理舊,充滿異國情調,超出標準的文本文件,我想你可以使用file -i沒有太多的問題。

+0

感謝您的回答,有道理。你有這樣一個文件的例子嗎?舊的MS-DOS或Windows格式我的意思是。 – Niklas9

+0

這可以是我認爲的一個例子。這是一個來自MS-DOS應用程序的舊文本文件,1988年。我的Ubuntu 12.04上的文件-i將它檢測爲application/octet-stream;字符集=二進制。某處有個錯誤的人物。我不是MASTER ENCONDER,但是如果你用okteta打開它,你可以在任何地方看到二進制數據(09字節)。 如果還有其他解釋讓我知道,謝謝。 http://filebin.ca/OOQ4WVHhaKT – GendoIkari

2

我發現「chared」(http://code.google.com/p/chared/)非常準確。您甚至可以爲不支持的語言培訓新的編碼檢測器。

當chardet開始行動時,這可能是一個很好的選擇。

+0

很酷,謝謝。它似乎有一個額外的要求,但你必須知道文中使用的語言。通常我不知道在我的應用程序..但它絕對似乎是一個很好的選擇。 – Niklas9

+1

是的,你需要知道的語言,但你可以使用例如langid(https://github.com/saffsd/langid.py)來猜測它。 –

相關問題