Estes -
=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?=
=?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?=
- são MIME Palavras codificadas . A forma geral é:
=?charset?encoding?encoded text?=
Você está correto em saber que o conjunto de caracteres é GBK, mas primeiro você deve interpretar a codificação de transporte , que é B
para Base64 ou Q
para Quoted-Printable. Assim:
py3.5 >>> base64.b64decode("sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=").decode("GBK")
'报的答复(下壕塘1号).doc'
No entanto, email.header
lidará com isso melhor:
py3.5 >>> email.header.decode_header("=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?=")
[(b'\xd5\xc2\xb9\xb1\xc7\xf8\xb3\xc7\xb9\xdc\xbe\xd6\xb9\xd8\xd3\xda\xcd\xf8\xc2\xe7\xd3\xdf\xc7\xe9\xd0\xc5\xcf\xa2\xd7\xa8\xb1\xa8\xb5\xc4\xb4\xf0\xb8\xb4(\xcf\xc2\xba\xbe\xcc\xc11\xba\xc5).doc', 'gbk')]
py3.5 >>> _[0][0].decode(_[0][1])
'章贡区城管局关于网络舆情信息专报的答复(下壕塘1号).doc'
A estrutura do primeiro resultado é tal porque um único cabeçalho pode ter múltiplos componentes, isto é, diferentes codificações ou textos brutos misturados e palavras codificadas. Diferentemente do Perl's Encode, o módulo Python deixa para você juntar () os resultados:
def decode_header(enc):
dec = email.header.decode_header(enc)
dec = [f[0].decode(f[1] or "us-ascii") for f in dec]
return "".join(dec)
Falando de Perl:
$ perl -E 'use open qw(:std :utf8);
use Encode;
say Encode::decode("MIME-Header", "=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?=");'
章贡区城管局关于网络舆情信息专报的答复(下壕塘1号).doc
(Além disso, o corpo não é codificado, ele é Base64 codificado. Eles usam conjuntos de caracteres diferentes, embora ambos sejam codificações 3: 4 e uudecode
seja geralmente inteligente o suficiente para detectar dados brutos Base64.)