gpt4 book ai didi

python - Python 2.7 解释器在发送到终端之前使用什么编码方案对 Unicode 代码点进行编码?

转载 作者:行者123 更新时间:2023-12-01 04:13:37 25 4
gpt4 key购买 nike

我使用的是Python 2.7。我的终端的编码方案设置为“utf-8”。 Python 的默认编码方案是“ascii”。

>>> sys.getdefaultencoding()'ascii'

当我写作时

>>> print(u'à')à

我的终端上显示了正确的 Unicode 字符。我不明白 python 解释器在将 Unicode 代码点发送到终端之前使用什么编码方案对其进行编码。是UTF-8吗?但 python 的默认编码方案设置为“ascii”。它如何决定使用 UTF-8 进行编码。

编辑:
我知道我可以自己指定编码,如下所示:

>>> print(u'à'.encode('utf-8'))à

但是想知道当我不指定编码时它是如何工作的。

最佳答案

Python 尝试确定终端编码并在打印到终端时使用该编码。 sys.stdout.encoding 包含检测到的编码。 getdefaultencoding() 是在未指定编码时用于对 Unicode 字符串进行编码的编码。

示例(Windows 控制台中的 Python 2):

>>> import sys
'ascii'
>>> sys.stdout.encoding
'cp437'

打印到终端使用sys.stdout.encoding。我使用终端编码中无效的Unicode字符来查看错误消息中的编码:

>>> print u'\xc1'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\xc1' in position 0: character maps to <undefined>

这里我没有指定编码,使用默认的编码:

>>> u'\xc1'.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)

示例(Windows 控制台中的 Python 3):

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> sys.stdout.encoding
'cp437'

打印仍然使用sys.stdout.encoding:

>>> print('\xc1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\dev\Python35\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xc1' in position 0: character maps to <undefined>

但默认编码是 Python 3 的默认 utf-8:

>>> '\xc1'.encode()
b'\xc3\x81'

重定向输出

重定向 Python 脚本的输出时,sys.stdout.encoding 的值可能会更改。这可以使用 PYTHONIOENCODING 环境变量覆盖。

Python 2 重定向不检测编码。它将默认为 ascii:

C:\>py -2 -c "import sys;print(sys.stdout.encoding)" | more
None

Python 3 使用 ANSI 编码(因 Windows 本地化版本而异):

C:\>py -3 -c "import sys;print(sys.stdout.encoding)" | more
cp1252

使用环境变量覆盖:

C:\>set PYTHONIOENCODING=utf8

C:\>py -2 -c "import sys;print(sys.stdout.encoding)" | more
utf8

C:\>py -3 -c "import sys;print(sys.stdout.encoding)"
utf8

关于python - Python 2.7 解释器在发送到终端之前使用什么编码方案对 Unicode 代码点进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com