关于python的问题';s编码

关于python的问题';s编码,python,encoding,python-2.x,Python,Encoding,Python 2.x,首先,我在命令行中测试默认编码 >>>import sys >>>print sys.getdefaultencoding() 'ascii' 然后,我给一个变量分配了一个汉字 >>>s="汉" >>>print s 汉 所以,我的问题是为什么ascii可以显示汉字?默认编码在这里不适用;它仅在Unicode和bytestring值之间进行隐式转换时使用 您在终端中创建了bytestring。终端对字符进行编码,然后存储

首先,我在命令行中测试默认编码

>>>import sys
>>>print sys.getdefaultencoding()
'ascii'
然后,我给一个变量分配了一个汉字

>>>s="汉"
>>>print s
汉

所以,我的问题是为什么ascii可以显示汉字?

默认编码在这里不适用;它仅在Unicode和bytestring值之间进行隐式转换时使用

您在终端中创建了bytestring。终端对字符进行编码,然后存储字节。打印字节会导致终端再次解码字节

例如,如果您的终端配置为使用UTF-8,您将在回显
s
时看到:

>>> s = "汉"
>>> s
'\xe6\xb1\x89'
这些是3个UTF-8字节,将它们打印回终端会产生终端知道如何再次解码的数据:

>>> print s
汉
请注意,在终端环境中,交互式提示符使用其在创建Unicode对象时检测到的终端编码来解码输入:

>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> unicode_string = u"汉"
>>> unicode_string
u'\u6c49'
>>> print unicode_string
汉
打印会自动再次对Unicode对象进行编码,以匹配终端编码。这与
.py
文件中Python源代码中的字符串文字形成对比,在该文件中,必须使用

最后但并非最不重要的一点是,
sys.getdefaultencoding()
用于隐式转换;将字节字符串与Unicode值连接时,例如:

>>> unicode_string + s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
unicode\u字符串+s 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xe6:序号不在范围内(128)
此处不适用默认编码;它仅在Unicode和bytestring值之间进行隐式转换时使用

您在终端中创建了bytestring。终端对字符进行编码,然后存储字节。打印字节会导致终端再次解码字节

例如,如果您的终端配置为使用UTF-8,您将在回显
s
时看到:

>>> s = "汉"
>>> s
'\xe6\xb1\x89'
这些是3个UTF-8字节,将它们打印回终端会产生终端知道如何再次解码的数据:

>>> print s
汉
请注意,在终端环境中,交互式提示符使用其在创建Unicode对象时检测到的终端编码来解码输入:

>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> unicode_string = u"汉"
>>> unicode_string
u'\u6c49'
>>> print unicode_string
汉
打印会自动再次对Unicode对象进行编码,以匹配终端编码。这与
.py
文件中Python源代码中的字符串文字形成对比,在该文件中,必须使用

最后但并非最不重要的一点是,
sys.getdefaultencoding()
用于隐式转换;将字节字符串与Unicode值连接时,例如:

>>> unicode_string + s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
unicode\u字符串+s 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xe6:序号不在范围内(128)