2015-06-08 52 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

相关问题