Python默认字符串编码
Python何时、何地以及如何隐式地将编码应用于字符串或隐式转码(转换) 那些“默认”(即隐含)编码是什么 例如,编码是什么:Python默认字符串编码,python,python-3.x,character-encoding,python-2.x,python-unicode,Python,Python 3.x,Character Encoding,Python 2.x,Python Unicode,Python何时、何地以及如何隐式地将编码应用于字符串或隐式转码(转换) 那些“默认”(即隐含)编码是什么 例如,编码是什么: 字符串字面值 s = "Byte string with national characters" us = u"Unicode string with national characters" 当类型转换为Unicode和从Unicode转换时,字节字符串的数量 data = unicode(random_by
- 字符串字面值
s = "Byte string with national characters" us = u"Unicode string with national characters"
- 当类型转换为Unicode和从Unicode转换时,字节字符串的数量
data = unicode(random_byte_string)
- 当字节和Unicode字符串写入/从文件或终端写入时
print(open("The full text of War and Peace.txt").read())
- 出于代码解析的目的:
(Py2)--不适用,从文件中获取原始字节str
(Py2)/unicode
(Py3)-“源代码编码”,默认为str
(Py2)和ascii
(Py3)utf-8
(Py3)--文本中禁止使用无、非ASCII字符字节
- 为了转码的目的:
- 两者(Py2)--
(sys.getdefaultencoding()
几乎总是)ascii
- 存在隐式转换,通常会导致出现
/UnicodeDecodeError
UnicodeDecodeError
- 存在隐式转换,通常会导致出现
- 两者(Py3)--无,在转换时必须显式指定编码
- 两者(Py2)--
- 对于I/O而言:
(Py2)--unicode
如果设置,否则.encoding
sys.getdefaultencoding()
(Py2)--不适用,写入原始字节str
(Py3)--str
,始终设置并默认为.encoding
locale.getpreferredencoding()
(Py3)——无,bytes
ing生成其print
repr()
首先,对一些术语进行澄清,以便您正确理解其余术语解码是从字节到字符的转换(Unicode或其他),而编码(作为一个过程)则是相反的。看看有没有区别 现在 读取源和解析字符串文本 (其确切效果将在后面描述)。如果未指定,Python 2的默认值为
ascii
,Python 3的默认值为utf-8
。UTF-8 BOM与UTF-8
编码声明具有相同的效果
Python 2
Python2将源代码读取为原始字节。它只在看到Unicode文本时使用“源编码”来解析Unicode文本。(,但这是净效应。)
>键入t.py
#编码:cp1251
s=“аббббббббб”
us=u“бббГб”
打印报告,报告(美国)
>py-2t.py
'\xe0\xe1\xe2\xe3\xe4'u'\u0430\u0431\u0432\u0433\u0434'
>py-2t.py
'\xe0\xe1\xe2\xe3\xe4'u'\u0440\u0441\u0442\u0443\u0444'
>py-2t.py
'\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4'u'\u0430\u0431\u0432\u0433\u0434'
因此,常规字符串将包含文件中的确切字节。和Unicode字符串将包含使用“源编码”对文件字节进行解码的结果。
如果解码失败,您将得到一个SyntaxError
。如果在未指定编码的情况下,文件中存在非ASCII字符,则相同。最后,如果使用了,任何常规字符串文本()在解析时都被视为Unicode文本,这意味着什么
Python 3
Python3使用“源代码编码”将整个源文件解码为Unicode字符序列。任何解析都是在这之后完成的。(特别是,这使得标识符中有Unicode成为可能。)由于所有字符串文字现在都是Unicode,因此不需要额外的转码。在字节文字中,禁止使用非ASCII字符(此类字节必须使用转义序列指定),从而完全避免了问题
转码
根据开始时的澄清:
(Py2)/str
(Py3)——bytes=>只能是bytes
d(即直接解码;详细信息如下)解码
(Py2)/unicode
(Py3)--字符=>只能是str
dencode
sys.getdefaultencoding()
。它是ascii
(除非您在site.py
中取消注释一个代码块,这会导致错误)。因此,为了进行代码转换,sys.getdefaultencoding()
是“字符串的默认编码”。
现在,这里有一个警告:
- a
和decode()
——使用默认编码——在转换encode()
时隐式完成:strunicode
- 在字符串格式中(三分之一的
/unicodecodeerror
有关堆栈溢出的问题与此有关)unicodecodeerror
- 尝试
aencode()
或str
adecode()
(堆栈溢出问题的第二个三分之一)unicode
- 在字符串格式中(三分之一的
str
和字节之间进行隐式转换
bytes
只能是decode
d和str
--encode
d,并且encoding
参数是必需的
- 转换
bytes->str
(包括隐式)会生成其repr()
(仅对调试打印有用),从而完全避免了编码问题
- 禁止转换
str->bytes
印刷
与变量的值无关,但与print
ed时您在屏幕上看到的内容相关——以及print
ing时您是否会得到UnicodeIncodeError
Python 2
- 一个
unicode
是encode> type t.py
# Encoding: cp1251
s = "абвгд"
us = u"абвгд"
print repr(s), repr(us)
> py -2 t.py
'\xe0\xe1\xe2\xe3\xe4' u'\u0430\u0431\u0432\u0433\u0434'
<change encoding declaration in the file to cp866, do not change the contents>
> py -2 t.py
'\xe0\xe1\xe2\xe3\xe4' u'\u0440\u0441\u0442\u0443\u0444'
<transcode the file to utf-8, update declaration or replace with BOM>
> py -2 t.py
'\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4' u'\u0430\u0431\u0432\u0433\u0434'