2015-06-08 77 views
1

爲什麼Python中的輸出增加\xe3爲什麼Python 3輸出 xe3,一個額外的字符?

>>> b'Transa\xc3\xa7\xc3\xa3o'.decode('utf-8') 
'Transaç\xe3o' 

期望值是:

'Transação' 

我的環境中的某些信息

>>> import sys 
>>> print (sys.version) 
3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] 
>>> sys.stdout.encoding 
'cp437' 

這是控制檯2下+電源外殼。

+1

在優勝美地3.4.3上適合我。 – jonrsharpe

+0

您需要告訴您的操作系統,Python版本以及您正在使用的終端(從'python'啓動時抓取版本字符串) –

+0

當我測試它時,它有兩個問題。輸出是:'u'Transa \ xe7 \ xe3o'' –

回答

4

您需要使用支持所有要打印的字符的控制檯或終端。

在交互式控制檯中打印時,字符會被編碼爲控制檯的正確編解碼器,並且使用backslashreplace error handler不支持的任何字符可以保持輸出的可讀性,而不會引發異常。這是默認sys.displayhook() function的特點:

如果repr(value)沒有中可編碼到sys.stdout.encodingsys.stdout.errors錯誤處理程序(這可能是'strict'),它與'backslashreplace'錯誤處理程序編碼爲sys.stdout.encoding

您的控制檯可以處理ç而不是ã。有幾個編解碼器包含第一個字符但不是最後一個;你正在使用IBM codepage 437,但它絕不是唯一的一個。

如果您在標準Windows控制檯(cmd.exe)中運行Python,請注意Python,Unicode和該控制檯混合不好。您可以安裝win-unicode-console package以使Python 3使用Windows API更好地輸出Unicode文本;你需要確保你的字體能夠顯示你的Unicode文本。

我不確定該軟件包是否與其他Windows shell兼容;你的旅費可能會改變。

+0

從版本字符串看,OP運行在ms-windows上,可能是'cmd.exe'。不是那裏最好的終端。開箱即用,它肯定會*不*使用UTF-8。如何改變已在SO上多次回答的問題。 –

+0

Windows控制檯允許您打印當前代碼頁不支持的Unicode字符。你提到的「win-unicode-console」就是這樣做的。參見[python3打印的Unicode到Windows XP控制檯編碼CP437(http://stackoverflow.com/q/28521944/4279) – jfs

+0

你應該提到的是,如果真的「backslashreplace」的行爲是特定於'再版()'(使用通過'sys.displayhook()'中REPL) – jfs

相關問題