18

Python でメール処理ソフトウェアを作成していますが、ヘッダー フィールドで奇妙なバイトが発生しています。これはただの不正なメールだと思います。メッセージ自体は us-ascii であると主張しているため、真のエンコーディングはないと思いますが、UnicodeDecodeError.

だから、私は astrとオプションでいくつかのヒントを取り、私に a を返すために最も大胆なことをする関数を探していunicodeます。もちろん、私が書くこともできますが、そのような関数が存在する場合、その作成者はおそらくこれを行う最善の方法についてもう少し深く考えているでしょう.

また、Python の設計は暗黙的よりも明示的なものを好み、標準ライブラリはテキストをデコードする際の暗黙的な魔法を回避するように設計されていることも知っています。「先に進んで推測してください」と明示的に言いたいだけです。

4

3 に答える 3

27

chardetモジュールの+1 (によって提案されます@insin)。

標準ライブラリにはありませんが、次のコマンドで簡単にインストールできます。

$ 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がない場合は、Pipのインストールを参照してください。

于 2008-11-06T16:13:29.367 に答える
14

私の知る限り、標準ライブラリには関数がありませんが、上記のように作成するのはそれほど難しくありません。私が探していたのは、文字列をデコードして例外がスローされないことを保証する方法だったと思います。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')
于 2008-11-07T21:03:20.330 に答える
1

私が見つけたこれを行うための最良の方法は、try except ブロック内の最も一般的なエンコーディングのそれぞれを使用して、prospective を繰り返しデコードすることです。

于 2008-11-07T02:31:26.907 に答える