いくつかのバイトの文字エンコーディングを推測しようとするPythonライブラリ関数はありますか? [複製]
-
06-07-2019 - |
質問
この質問にはすでに回答があります:
- テキストのエンコーディングの決定方法 9つの答え
Pythonでメール処理ソフトウェアを書いていますが、ヘッダーフィールドに奇妙なバイトがあります。これは単なる不正なメールであると思われます。メッセージ自体はus-asciiであると主張しているため、真のエンコーディングはないと思いますが、 UnicodeDecodeError
をスローすることなく、元のエンコーディングに近いUnicode文字列を取得したいです。
だから、 str
とオプションでいくつかのヒントを受け取り、 unicode
を返すためにdarndestを実行する関数を探しています。もちろん、1つ書くことはできますが、そのような関数が存在する場合、その作成者はおそらくこれを実行するための最良の方法についてもう少し深く考えていました。
また、Pythonの設計は暗黙よりも明示の方が好みであり、標準ライブラリはテキストのデコードにおける暗黙の魔法を避けるように設計されていることも知っています。 「先に進んで推測」と明示的に言いたいだけです。
解決 3
私が知る限り、標準ライブラリには関数はありませんが、上記のように記述するのはそれほど難しくありません。私が探していた本当のことは、文字列をデコードし、例外がスローされないことを保証する方法だったと思います。 string.decodeのerrorsパラメータがそれを行います。
def decode(s, encodings=('ascii', 'utf8', 'latin1')):
for encoding in encodings:
try:
return s.decode(encoding)
except UnicodeDecodeError:
pass
return s.decode('ascii', 'ignore')
他のヒント
標準ライブラリにはありませんが、次のコマンドで簡単にインストールできます。
$ pip install chardet
例:
>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
お持ちでない場合は、 Pipのインストールをご覧ください。
Universal Encoding Detector に興味があるかもしれません。
これを行うための最良の方法は、ブロックを除くtry内で最も一般的なエンコーディングのそれぞれを使用して、見込みのあるものを繰り返しデコードすることです。