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()

现在…

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

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'

> py -2 t.py

'\xe0\xe1\xe2\xe3\xe4' u'\u0440\u0441\u0442\u0443\u0444'

> 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(),完全避开编码问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值