4

PythonミルターのMIMEメッセージからファイルを抽出していて、次のような名前のファイルで問題が発生しています。

=?ISO-8859-1?Q?Certificado = 5FZonificaci = F3n = 5F2010 = 2Epdf?=

この名前をUTFにデコードできないようです。以前のISO-8859-1の問題を解決するために、私はすべてのファイル名をこの関数に渡し始めました。

def unicodeConvert(self, fname):
    normalized = False

    while normalized == False:
        try:
            fname  = unicodedata.normalize('NFKD', unicode(fname, 'utf-8')).encode('ascii', 'ignore')
            normalized = True
        except UnicodeDecodeError:
            fname = fname.decode('iso-8859-1')#.encode('utf-8')
            normalized = True
        except UnicodeError:
            fname = unicode(fname.content.strip(codecs.BOM_UTF8), 'utf-8')
            normalized = True
        except TypeError:
            fname = fname.encode('utf-8')

    return fname

このファイル名に到達するまで機能していました。

アイデアはいつものように高く評価されています。

4

1 に答える 1

8

文字列は、MIME ヘッダーのQuoted-printable形式を使用してエンコードされます。email.headerモジュールがこれを処理します。

>>> from email.header import decode_header
>>> try:
...     string_type = unicode  # Python 2
... except NameError:
...     string_type = str      # Python 3
...
>>> for part in decode_header('=?ISO-8859-1?Q?Certificado=5FZonificaci=F3n=5F2010=2Epdf?='):
...     decoded = string_type(*part)
...     print(decoded)
...
Certificado_Zonificación_2010.pdf
于 2012-07-25T12:45:18.607 に答える