我试图了解PYTHONIOENCODING环境变量如何适合Python2.7,所以我在交互式提示下尝试了以下操作:antox@antox-pc ~/Scrivania $ export PYTHONIOENCODING='latin1'antox@antox-pc ~/Scrivania $ /usr/bin/python2.7Python 2.7.6 (default, Mar 22 2014, 22:59:56)[GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import sys>>> sys.stdin.encoding'latin1'>>> sys.stdout.encoding'latin1'>>> b = 'ÿ'>>> b'\xc3\xbf' #Shouldn't I get something like '\xff' because I set PYTHONIOENCODING to latin1? It looks as if utf-8 is been used instead>>> print '\xff'� # Why this odd character? Shouldn't I get 'ÿ' always for the reason above?我的问题/疑惑表示为评论。 最佳答案 通过在环境中设置PYTHONIOENCODING,您可以告诉Python不信任您的终端/操作系统有关编码的信息-就是说您了解得更多,并且终端设备实际上接受该编码,而不管OS&c是什么会告诉Python。因此,在这种情况下,您是说(无论是否有其他声明)您的终端实际上​​接受并正确格式化了latin-1中的字节。可能不是这种情况(如果您未设置该环境变量,sys.stdout.encoding会说什么?utf-8,我猜是吗?),因此没有得到想要的显示也就不足为奇了:-)。关于您的特定问题,sys.getdefaultencoding()告诉您在没有其他指示的情况下(在I / O到stdin / stdout的情况不是其中之一,因为Python使用这些文件的属性)。>>> b = 'ÿ'这与sys.stdin / stdout无关-相反,您的终端正在发送引号后的一些“转义序列”,这些序列转为正确的utf-8(例如,我的Mac的Terminal应用程序确实如此)。如果这是在encoding文件中而没有正确的源编码前同步码,则将是语法错误-交互式解释器在2.7.9:-中已成为软包装。>>> print '\xff'� # Why this odd character? Shouldn't I get 'ÿ' always for the reason above?您已经告诉Python您的终端接受并正确显示了拉丁1字节序列(即使终端可能想要utf-8序列并告诉Python,您却告诉Python忽略了终端关于其编码的说法,或者说,操作系统说终端说:-)。因此,值255的字节按原样发送,并且终端不喜欢它一位(因为终端实际上​​不接受latin-1!)并显示错误标记。这是我的Mac(终端实际上​​接受'utf-8')上的典型示例:ozone:~ alex$ PYTHONIOENCODING=latin-1 python -c "print u'\xff'"?ozone:~ alex$ PYTHONIOENCODING=utf-8 python -c "print u'\xff'"ÿozone:~ alex$ python -c "print u'\xff'"ÿ让Python正确地自行检测终端编码,或强迫它恰好是正确的编码。毫无疑问,将编码强制为终端实际上​​不接受的编码不会正确显示。如果您曾经在机器的串行端口上连接了实际上接受latin-1的老式电传打字机(但操作系统无法正确检测到该事实),.py将帮助您在该老式电传打字机上正确执行Python I / O。否则,上述环境设置不太可能对您有用:-)。
10-06 12:44