Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python编码如何适合Python 2_Python_Python 2.7 - Fatal编程技术网

Python编码如何适合Python 2

Python编码如何适合Python 2,python,python-2.7,Python,Python 2.7,我试图理解PythonionEncoding环境变量如何适合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", "c

我试图理解PythonionEncoding环境变量如何适合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?

我的问题/疑问以注释的形式表示。

通过在环境中设置
pythonoencoding
,您告诉Python不要相信您的终端/OS关于编码的信息——您说您知道得更好,并且终端设备实际上接受了该编码,不管操作系统和控制系统会告诉Python什么

因此,在本例中,您的终端实际上接受并正确格式化
拉丁语-1
中的字节

情况可能并非如此(如果您不设置该环境变量,
sys.stdout.encoding
会说什么?
utf-8
,我想?),因此不获得所需的显示也就不足为奇了:-)

关于你的具体问题,

sys.getdefaultencoding()
告诉您在没有其他指示的情况下(输入/输出到stdin/stdout不是这些情况之一,因为它使用这些文件的
编码
属性),Python将使用什么编码在实际文本(即Unicode)和字节字符串之间进行翻译

这与sys.stdin/stdout无关——相反,您的终端在打开引号后发送一些“转义序列”,可以归结为正确的utf-8(例如,我的Mac终端应用程序)。如果这是在一个
.py
文件中,没有正确的源代码编码前导,那将是一个语法错误——交互式解释器在2.7.9:-)中变软了

您已经告诉Python您的终端接受并正确显示拉丁1字节序列(尽管终端可能需要utf-8字节序列并告诉Python,但您已经告诉Python忽略终端对其编码的说明,或者更确切地说,操作系统对终端的说明:-)

因此,值255的字节按原样发送,终端不喜欢它一位(因为终端实际上不接受拉丁语-1!),并显示一个错误标记

下面是我的Mac上的一个典型示例(终端实际上接受“utf-8”):

让Python自己正确地检测终端编码,或者强制它使用正确的编码,都可以正确地显示

将编码强制为终端不接受的编码,不出所料,实际上不会正确显示


如果您曾经在机器的串行端口上连接一个实际上接受拉丁语-1(但操作系统没有正确地检测到这个事实)的古老电传打字机,
pythoniocodeding
将帮助您正确地对该古老电传打字机执行Python I/O。否则,所述环境设置不太可能对您有多大用处:-)。

因此,如果我理解,当我在关键字上键入一个字符时,它将根据操作系统/终端的编码转换为字节流,然后将该流发送到python;根据PythonionEncoding,python使用“latin1”和viceversa读取这些字节。是吗?是的,但是如果终端+操作系统实际发送的是utf-8中的字节序列,那么错误地接受它们,就好像它们是拉丁-1字节一样,是没有帮助的。反之亦然,Python代码发送到sys.stdout的字节序列。好的,我想这很清楚。B.T.W是否有一个命令告诉我终端使用的是什么编码?@antox,不是一般的,也不是完全可靠的,但是,请尝试各种答案——当您将古老的TTY连接到串行端口时,如果它们出现错误,请不要感到惊讶,因为您的操作系统可能无法正确支持/检测它。。。
>>> b = 'ÿ'
>>> print '\xff'
�            # Why this odd character? Shouldn't I get 'ÿ' always for the reason above?
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'"
ÿ