2017-02-08 44 views
0

製作它簡單和直接的,我有這樣原始字符串,這與中國字符的filneme:???正確解碼MIME編碼的電子郵件attachament名稱爲unicode對象

= UTF-8乙5L + d56iO5LuT5Y + ?R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g = =

根據http://dogmamix.com/MimeHeadersDecoder/,它的decoed版本看起來像以下:

保稅倉發貨日報1.19-1.21.xlsx(這是正確的)

我試圖解碼此得到下面的結果NG unicode字符串:

u'保稅倉發貨日報1.19-1.21.xlsx' 

我在做什麼是:

第1步:

in_str = '=?utf-8?B?5L+d56iO5LuT5Y+R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g=?=' 
from email.header import decode_header 
res = decode_header(in_str) 

然後解析度是以下形式的元組的列表:

[('\xe4\xbf\x9d\xe7\xa8\x8e\xe4\xbb\x93\xe5\x8f\x91\xe8\xb4\xa7\xe6\x97\xa5\xe6\x8a\xa51.19-1.21.xlsx', 'utf-8')] 

什麼會產生一個問題 - 爲什麼res [0] [0]它只是一個字節串,部分是一個普通的原始字符串('1.19-1.21.xlsx'是一個原始的par噸的字符串)?但讓我們繼續。

步驟2.

讓我們來解碼從UTF-8編碼的字節字符串,因爲我相信這是UTF-8編碼的字符串(邏輯吧?)

filename = res[0][0].decode('utf-8') 

我相信這應該返回以下Unicode字符串:

u'保稅倉發貨日報1.19-1.21.xlsx' 

,但我得到另一個字節串,而不是(這個時間的unicode):

u'\u4fdd\u7a0e\u4ed3\u53d1\u8d27\u65e5\u62a51.19-1.21.xlsx' 

這使我瘋狂,因爲我相信我正在做正確的事情。

順便說一句,是的,我讀過「Unicode HOWTO」,仍然不知道如何解決它。

+1

最後一個字符串_is_是一個Unicode字符串,而不是一個字符串(它是Python 2中的一個純字符串)。最後2個Unicode字符串是相同的:試試'u'保稅倉發貨日報1.19-1.21.xlsx'== u'\ u4fdd \ u7a0e \ u4ed3 \ u53d1 \ udd5 \ u62a51.19-1.21.xlsx''。如果您在使用UTF-8的終端中打印它們中的任何一個,並且支持這些字形的字體,您將看到所需的輸出。您還應該使用'print'\ xe4 \ xbf \ x9d \ xe7 \ xa8 \ x8e \ xe4 \ xbb \ x93 \ xe5 \ x8f \ x91 \ xe8 \ xb4 \ xa7 \ xe6 \ x97 \ xa5 \ xe6 \ x8a來獲得輸出\ xa51.19-1.21.xlsx'' –

+1

您可能會發現這篇文章有用:[Pragmatic Unicode](http://nedbatchelder.com/text/unipain.html),這是SO老將Ned Batchelder寫的。 –

+0

@PM 2Ring,你真是該死的,謝謝! –

回答

1

繼續你的榜樣,並使用支持該字體的字符的IDE:

#!python2 
in_str = '=?utf-8?B?5L+d56iO5LuT5Y+R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g=?=' 
from email.header import decode_header 
res = decode_header(in_str) 
for data,enc in res: 
    print data.decode(enc) 

輸出:

保稅倉發貨日報1.19-1.21.xlsx 

在Python 2,你必須解碼和打印字符串正確顯示。