2012-07-01 42 views
14

我看了從官方文檔的HOWTO on Unicode和一個完整的,非常詳細article爲好。不過,我不明白爲什麼它會拋出我這個錯誤。UnicodeEncodeError:「ASCII」編解碼器不能編碼字符[...]

以下是我嘗試:我打開一個包含字符的ASCII出範圍(但裏面XML允許範圍)的XML文件。我用cfg = codecs.open(filename, encoding='utf-8, mode='r')這樣做運行良好。用repr()查看字符串也顯示了一個unicode字符串。

現在我繼續前進,閱讀了parseString(cfg.read().encode('utf-8')。當然,我的XML文件以這個開頭:<?xml version="1.0" encoding="utf-8"?>。雖然我認爲它不相關,但我也爲我的python腳本定義了utf-8,但由於我不直接在其中編寫unicode字符,因此這裏不適用。以下行相同:from __future__ import unicode_literals這也是正確的開始。

接下來的事情我通過生成的對象,以我自己的類在那裏我閱讀標籤到這樣的變量:xmldata.getElementsByTagName(tagName)[0].firstChild.data並將其分配給在我班上的一個變量。

現在什麼完美的作品是那些命令(obj是一個類的實例):

for element in obj: 
    print element 

而這個命令不會工作,以及:

print obj.__repr__() 

我定義__iter__()只得到每而__repr__()使用典型的printf東西:"%s" % self.varname

這兩個命令打印完美,可以輸出t他unicode字符。 什麼不工作是這樣的:

print obj 

現在我堅持,因爲這將引發可怕的

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47: 

所以我缺少什麼?我究竟做錯了什麼?我正在尋找一個通用的解決方案,我總是希望將字符串處理爲unicode,以避免任何可能的錯誤並編寫兼容的程序。

編輯:我也這樣定義的:

def __str__(self): 
    return self.__repr__() 
def __unicode__(self): 
    return self.__repr__() 

從技術文檔我得到這個

+1

'print obj'將使用該對象的'__str__',而不是'__repr__'。 – BrenBarn

+2

你的默認編碼是什麼?我的意思是* sys.getdefaultencoding()* –

+0

@BrenBarn:__str__實現爲返回__repr __() – javex

回答

4

我終於解決了這個問題。問題在於(我不確定爲什麼),如果直接調用__str__()__repr__(),它可能會處理得很好,但直接打印(如:print obj)不起作用(儘管它本身只應該調用__str__()本身)。

最終幫助來自這個article。當我使用utf-8編碼時,我已經到了將它打印到控制檯(但錯誤的字母)的步驟。終於解決它通過定義這是完全正確的:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

現在唯一懸而未決的問題剩下的就是:爲什麼print obj.__str__()print obj不同與此?這對我來說沒有任何意義。是的,再次強調:調用前者或__repr__() DID工作。仍然用顯式編碼。

+0

幫助文章不再可用 – Martlark

相關問題