2015-12-08 25 views
3

我投了一些Python代码中,我现在看到的错误日志:如何在Python中使用.encode('utf-8')?

Traceback (most recent call last): 
    File "./app/core.py", line 772, in scrapeEmail 
    l.info('EMAIL SUBJECT: ', header['value']) 
    File "./app/__init__.py", line 44, in info 
    logging.info(str(datetime.utcnow()) + ' INFO  ' + caller.filename + ':' + str(caller.lineno) + ' - ' + ' '.join([str(x) for x in args])) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 25: ordinal not in range(128) 

我猜意味着header['value']包含不同编码的字符。

我搜索了周围,this SO answer建议“将.encode('utf-8')放在最近​​版本的Python对象的末尾”。

这提高了我两个问题:

  1. 在什么对象,我需要使用.encode('utf-8')。在xstr(x)。那么应该是str(x.encode('utf-8'))还是str(x).encode('utf-8')
  2. 作者用“最近的Python版本”来表示什么?我仍然可以在Python 2.7中使用.encode('utf-8')

通常我会试一下,但是找到发生错误的字符串并不容易(实际上不可能)。所以我不能真正测试它。

这里有一点帮助,将不胜感激。

+0

为1),除非你的对象x实现方法'encode',你使用它的字符串(其中有一个方法'.encode') – DainDwarf

+1

这个答案是不相关的你;在字符串调用结束时随机放置编码不太可能有所帮助。问题是更有可能的是你已经覆盖用自己的实现,它不会做正确的事'info'方法。关于在日志消息中放入什么的决定属于[格式化程序](https://docs.python.org/2/library/logging.html#logging.Formatter),而不是记录程序子类。 –

+0

您是否尝试过使用Unicode( '东西'),而不是STR( '东西')? – pazitos10

回答

4

我建议你应该得到清楚知道有关Unicode和其他编码格式(如GB2312,GBK)首先之间的关系。很快就没有编码和解码的主要问题:)

下图将向您显示关系,一旦您掌握了关键点,就会知道何时以及如何在您的代码中进行编码和解码。 :)

---------    -----------    ---------- 
|  | 1.decode(A) |   | 2.encode(B) |  | 
| A | -----------> | unicode | ----------->| B | 
|  | <----------- |   | <---------- |  | 
|  | 4.encode(A) |   | 3.decode(B) |  | 
---------    -----------    ---------- 

因此,根据该图,你应该知道编码是什么,现在,什么编码要转换,然后按照关系为图所示。