2015-12-08 61 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) |  | 
---------    -----------    ---------- 

因此,根據該圖,你應該知道編碼是什麼,現在,什麼編碼要轉換,然後按照關係爲圖所示。