2017-02-08 17 views
0

делает его простым и понятным, у меня есть такая сырая строка, которая является filneme с китайскими иероглифами:?Правильно декодирование мима кодируется именем электронной почты attachament для Юникода объекта

= UTF--B 5л + d56iO5LuT5Y + ? R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g =

Согласно http://dogmamix.com/MimeHeadersDecoder/, то decoed версия этого выглядит следующим образом:

保税 仓 发货 日报 1.19-1.21.xlsx (который справа)

Я пытаюсь расшифровать это получить нг юникод строки:

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» является сырой пар t строки)? Но продолжим.

Шаг 2.

Давайте декодировать эту байтовую строку из UTF-8, как я считаю, что это UTF-8 строка в кодировке (логично, правда?)

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

Я считаю, что это должно вернуться следующим юникода строка:

u'保税仓发货日报1.19-1.21.xlsx' 

Но я получить другой байтовой строки вместо (на этот раз юникода):

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

Что меня заводит, я считаю, что делаю все правильно.

BTW, да, я прочитал «Unicode HOWTO», до сих пор не знаю, как это исправить.

+1

Эта последняя строка _is_ строка Unicode, а не байтовая строка (которая является простой строкой в ​​Python 2). Эти последние 2 строки Unicode равны: try 'u '保税 仓 发货 日报 1.19-1.21.xlsx' == u '\ u4fdd \ u7a0e \ u4ed3 \ u53d1 \ u8d27 \ u65e5 \ 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 Нед Батчелдер. –

+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, вы должны расшифровать и напечатать строки для правильного отображения.