Wie kann man diesen scheinbar GBK-codierten String entschlüsseln?

937
Nicolas Raoul

Ich habe eine .emlE-Mail-Datei mit einem MS-Word-Anhang:

------=_Part_239376_662463351.1415605722579 Content-Type: application/msword; name="=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?="  0M8R4KGxGuEAAAAAAAAA [rest of base64-encoded attachment] 

Ich habe den Anhang erfolgreich base64-decodiert, und der Inhalt der Datei ist in Ordnung.
Aber wie kann man den Dateinamen entschlüsseln?

Der Wert filename="" scheint zu GBK - codierten aber Python .decode('gbk')funktioniert nicht auf sich, die gleiche Zeichenfolge zurückgegeben:

>>> "1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo".decode('gbk') u'1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo' 

Also, wo ist diese Zeichenfolge kodiert und wie wird sie entschlüsselt?

=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?= 
1

1 Antwort auf die Frage

3
grawity

Diese -

=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?= 

- sind MIME- codierte Wörter . Die allgemeine Form lautet:

=? charset ? Codierung ? kodierter Text ? =

Der Zeichensatz ist GBK. Sie müssen jedoch zunächst die Transportkodierung interpretieren, die entweder Bfür Base64 oder Qfür Quoted-Printable gilt. Somit:

py3.5 >>> base64.b64decode("sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=").decode("GBK") '报的答复(下壕塘1号).doc' 

Allerdings email.headerwird handhaben dies besser:

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' 

Die Struktur des ersten Ergebnisses ist so, dass ein einzelner Header mehrere Komponenten enthalten kann, dh unterschiedliche Codierungen oder gemischten Rohtext und Encoded-Words. Im Gegensatz zu Perls Encode überlässt das Python-Modul Ihnen die Möglichkeit, die Ergebnisse zu verbinden:

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) 

Apropos Perl:

$ perl -E 'use open qw(:std :utf8); use Encode; say Encode::decode("MIME-Header", "=?GBK?B?1cK5scf4s8e53L7WudjT2s34wufT38fp0MXPoteo?= =?GBK?B?sai1xLTwuLQoz8K6vszBMbrFKS5kb2M=?=");' 章贡区城管局关于网络舆情信息专报的答复(下壕塘1号).doc 

(Außerdem ist der Körper nicht uuencodiert, sondern Base64- kodiert. Sie verwenden unterschiedliche Zeichensätze, obwohl beide 3: 4-Kodierungen sind und uudecodenormalerweise intelligent genug sind, um rohe Base64 zu erkennen.)

Danke für den Hinweis uu / base64, ich habe meine Frage behoben, danke! Nicolas Raoul vor 7 Jahren 0