编程语言
首页 > 编程语言> > Python默认字符串编码

Python默认字符串编码

作者:互联网

何时,何地以及如何将Python隐式应用于字符串或进行隐式转码(转换)?

那些“默认”(即暗示)编码是什么?

例如,编码是什么:

>字符串文字?

s = "Byte string with national characters"
us = u"Unicode string with national characters"

>在Unicode中进行类型转换时的字节字符串>

data = unicode(random_byte_string)

>当字节和Unicode字符串写入文件或终端时?

print(open("The full text of War and Peace.txt").read())

解决方法:

这里涉及Python功能的多个部分:读取源代码并解析字符串文字,转码和打印.每个都有自己的约定.

简短回答:

>出于代码解析的目的:

> str(Py2) – 不适用,从文件中获取原始字节
> unicode(Py2)/ str(Py3) – “源编码”,默认为ascii(Py2)和utf-8(Py3)
> bytes(Py3) – none,在文字中禁止非ascii字符

>出于转码的目的:

> both(Py2) – sys.getdefaultencoding()(ascii几乎总是)

>存在隐式转换,这些转换通常会导致UnicodeDecodeError / UnicodeEncodeError

> both(Py3) – none,必须在转换时明确指定编码

>出于I / O的目的:

> unicode(Py2) – < file> .encoding如果设置,否则sys.getdefaultencoding()
> str(Py2) – 不适用,写入原始字节
> str(Py3) – < file> .encoding,始终设置并默认为locale.getpreferredencoding()
> bytes(Py3) – none,print生成其repr()

首先,一些术语澄清,以便您正确理解其余部分.解码是从字节到字符(Unicode或其他)的转换,而编码(作为一个过程)则相反.请参阅The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) – Joel on Software以获得区别.

现在…

读取源代码并解析字符串文字

At the start of a source file, you can specify the file’s “source encoding”(其确切效果将在后面描述).如果未指定,则默认为Python 2的ascii和Python 3的utf-8.UTF-8 BOM与utf-8编码声明具有相同的效果.

Python 2

Python 2将源读取为原始字节.它只使用“源编码”来解析Unicode文字. (It’s more complicated than that under the hood但这是净效应.)

> 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'    

因此,常规字符串将包含文件中的确切字节. Unicode字符串将包含使用“源编码”解码文件字节的结果.

如果解码失败,您将收到SyntaxError.如果没有指定编码,文件中有非ascii字符也是如此.最后,如果使用unicode_literals future,则在解析时将任何常规字符串文字(in that file only)视为Unicode文字,其中包含所有含义.

Python 3

Python 3使用“源编码”将整个源文件解码为Unicode字符序列.之后进行任何解析. (特别是,这使得标识符中可以使用Unicode.)由于所有字符串文字现在都是Unicode,因此不需要额外的转码.在字节文字中,禁止使用非ascii字符(必须使用转义序列指定此类字节),完全避开该问题.

转码

根据一开始的澄清:

> str – bytes =>只能被解码(直接,即;详细信息如下)
> unicode – characters =>只能编码

Python 2

在这两种情况下,如果未指定编码,则使用sys.getdefaultencoding().它是ascii(除非你取消注释site.py中的代码块,or do some other hacks are a recipe for disaster).因此,为了进行转码,sys.getdefaultencoding()是“字符串的默认编码”.

现在,这是一个警告:

>一个decode()和encode() – 使用默认编码 – 在转换str< - > unicode时隐式完成:

>在字符串格式化(关于SO的UnicodeDecodeError / UnicodeEncodeError问题的三分之一)
>当尝试编码()一个str或decode()一个unicode(SO问题的第二个三分之一)

Python 3

根本没有“默认编码”:现在禁止在str和字节之间进行隐式转换.
(由于来自混淆用户的SO问题的数量证明,事实证明它比它的价值更麻烦.)

>字节只能被解码和str编码,编码参数是必需的.
>转换bytes-> str(包括隐式)生成其repr()(仅对打印有用),完全避开编码问题
>禁止转换str->字节

印花

This matter与变量的值无关,但与打印时在屏幕上看到的内容有关 – 以及打印时是否会出现UnicodeEncodeError.

Python 2

>如果设置,则使用< file> .encoding对unicode进行编码;否则,它按照上面的含义隐式转换为str. (UnicodeEncodeError SO问题的最后三分之一就在这里.)

>对于标准流,流的编码在启动时从各种环境特定的源中猜测,并且可以使用PYTHONIOENCODING envvar覆盖.

> str的字节按原样发送到OS流.您将在屏幕上看到的具体字符取决于您的终端编码(如果它是UTF-8,如果您打印的字节序列是无效的UTF-8,您可能根本看不到任何内容).

Python 3

变化是:

>现在使用文本vs二进制模式打开的文件本身接受str或bytes,相应地,并且完全拒绝处理错误的类型.文本模式文件始终具有编码集locale.getpreferredencoding(False) being the default.
> print for text streams仍然隐式地将所有内容转换为str,在字节的情况下按照上面的内容打印其repr(),完全避开编码问题

标签:python-unicode,python,python-3-x,character-encoding,python-2-x
来源: https://codeday.me/bug/20190928/1825461.html