email.header没有处理芬兰字符?

时间:2015-06-17 13:23:53

标签: python unicode utf-8 utf python-unicode

某个Python API会返回u'J\xe4rvenp\xe4\xe4'作为结束语Järvenpää。

其中\ xe4 ==ä

然后我调用email.header将此字段添加到要打印的标题中。

email.header在尝试解码变音符号时会失败:

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/email/header.py", line 73, in decode_header
    header = str(header)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)

我尝试过几件事:

  • 添加# -*- coding: utf-8 -*- 到header.py
  • 的顶部
  • 在将芬兰语字符串传递给email.header
  • 之前调用unicode()
  • 在将芬兰语字符串传递给email.header
  • 之前调用.encode('utf-8')

没有人解决了这个问题。我做错了什么?我想,解决方案不会涉及修改header.py(核心Python模块)。

Python版本:2.7.10

更新

Header()未直接实例化。而是我在字符串上调用decode_header()函数:

email.Header.decode_header(theString)

现在似乎只是简单地扩展了这个:

email.Header.decode_header(theString.encode('utf-8'))

解决问题

2 个答案:

答案 0 :(得分:2)

为了让email.header模块处理编码并创建一个合适的头,你必须创建一个email.header.Header的实例,其中包含你的字符串和应该编码的字符集:

>>> h = Header(text, charset)

例如:

>>> t = u'J\xe4rvenp\xe4\xe4'
>>> print t
Järvenpää
>>> from email.header import Header
>>> h = Header(t, 'utf-8')
>>> h
<email.header.Header instance at 0x7fc2636e7950>
>>> print h
=?utf-8?b?SsOkcnZlbnDDpMOk?=
>>> h = Header(t, 'iso-8859-1')
>>> print h
=?iso-8859-1?q?J=E4rvenp=E4=E4?=

字符串可以是 unicode 字符串,也可以是字节字符串

  • 如果您使用unicode字符串,charset只会影响标题编码的编码。
  • 如果使用字节字符串,charset将确定假定字节字符串的编码方式,以及将使用哪种编码对标头进行编码。如果您提供的字节字符串无法使用charset进行解码,则会引发异常。

答案 1 :(得分:-1)

AFAIK,str()处理ascii,这就是你收到错误的原因。如果您的字符串是unicode,则应该header = unicode(header),否则应该先解码。

#!/usr/bin/python
# -*- coding: utf-8 -*-

header = unicode("Järvenpää".decode('UTF-8'))
print header

输出

Järvenpää