我试图了解PYTHONIOENCODING环境变量如何适合Python2.7,所以我在交互式提示下尝试了以下内容:
antox@antox-pc ~/Scrivania $ export PYTHONIOENCODING='latin1'
antox@antox-pc ~/Scrivania $ /usr/bin/python2.7
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "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?
我的问题/怀疑被表示为评论。
答案 0 :(得分:2)
通过在环境中设置PYTHONIOENCODING
,您告诉Python 不信任您的终端/操作系统有关编码的信息 - 您说的是您更了解,并且终端设备实际上接受该编码,而不是操作系统和操作系统将告诉Python。
所以在这种情况下,你说的是(无论它声称的是什么)你的终端实际上接受并正确格式化latin-1
中的字节。
可能不是这种情况(如果你没有设置那个环境变量sys.stdout.encoding
说什么?utf-8
,我猜?)所以你没有得到显示就不足为奇了你想要: - )。
关于你的具体问题,
sys.getdefaultencoding()
告诉你Python将用于在实际文本(即Unicode)和字节字符串之间进行转换的编码,在没有其他指示的情况下(stdin / stdout的I / O不是其中一种情况,因为它使用这些文件的encoding
属性。)
>>> b = 'ÿ'
这与sys.stdin / stdout无关 - 相反,你的终端在开放引用之后发送了一些归结为正确的utf-8的“转义序列”(例如我的Mac终端应用程序) )。如果这是在没有正确的源编码前导码的.py
文件中,则会出现语法错误 - 交互式解释器在2.7.9中变得很软: - )
>>> print '\xff'
� # Why this odd character? Shouldn't I get 'ÿ' always for the reason above?
你告诉Python你的终端接受并正确显示latin-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(但操作系统没有正确检测到这个事实),PYTHONIOENCODING
将帮助你正确地进行Python I / O在那古老的电传打字机上。否则,所述环境设置不太可能对您有用: - )。