Python3 是如何解决棘手的字符编码问题的?

Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。本文就和大家一起来扒一扒python3是如何解决的字符编码问题,希望对大家学习python3有所帮助。

Python2 字符串设计上的一些缺陷:

· 使用 ASCII 码作为默认编码方式,对中文处理很不友好。

· 把字符串的牵强地分为 unicode 和 str 两种类型,误导开发者

当然这并不算 Bug,只要处理的时候多留心也可以避免这些坑。但在 Python3 两个问题都很好的解决了。

首先,Python3 把系统默认编码设置为 UTF-8

>>> import sys

>>> sys.getdefaultencoding()

’utf-8’

>>>

然后,文本字符和二进制数据区分得更清晰,分别用 str 和 bytes 表示。文本字符全部用 str 类型表示,str 能表示Unicode 字符集中所有字符,而二进制字节数据用一种全新的数据类型,用 bytes 来表示。

str

>>> a = "a">>> a’a’>>> type(a)

<class ’str’>

>>> b = "禅">>> b’禅’>>> type(b)

<class ’str’>

bytes

Python3 中,在字符引号前加‘b’,明确表示这是一个 bytes 类型的对象,实际上它就是一组二进制字节序列组成的数据,bytes 类型可以是 ASCII范围内的字符和其它十六进制形式的字符数据,但不能用中文等非ASCII字符表示。

>>> c = b’a’>>> c

b’a’>>> type(c)class ’bytes’>

>>> d = b’\xe7\xa6\x85’>>> d

b’\xe7\xa6\x85’>>> type(d)class ’bytes’>>>>

>>> e = b’禅’

File "", line 1SyntaxError: bytes can only contain ASCII literal characters.

bytes 类型提供的操作和 str 一样,支持分片、索引、基本数值运算等操作。但是 str 与 bytes 类型的数据不能执行 +操作,尽管在py2中是可行的。

>>> c = b’a’>>> c

b’a’>>> type(c)

<class ’bytes’>

>>> d = b’\xe7\xa6\x85’>>> d

b’\xe7\xa6\x85’>>> type(d)

<class ’bytes’>>>>

>>> e = b’禅’

File "", line 1SyntaxError: bytes can only contain ASCII literal characters.

python2 与 python3 字节与字符的对应关系

encode 与 decode

str 与 bytes 之间的转换可以用 encode 和从decode 方法。

encode 负责字符到字节的编码转换。默认使用 UTF-8 编码准换。

>>> s = "Python之禅"

>>> s.encode()

b’Python\xe4\xb9\x8b\xe7\xa6\x85’

>>> s.encode("gbk")

b’Python\xd6\xae\xec\xf8’

decode 负责字节到字符的解码转换,通用使用 UTF-8 编码格式进行转换。

>>> b’Python\xe4\xb9\x8b\xe7\xa6\x85’.decode()

’Python之禅’

>>> b’Python\xd6\xae\xec\xf8’.decode("gbk")

’Python之禅’

来源:伯乐在线

时间: 08-09

Python3 是如何解决棘手的字符编码问题的?的相关文章

读《Python3 是如何解决棘手的字符编码问题的》的笔记

对于Python的编码值得注意的是不同的版本编码方式是不同的.Python3默认的是utf-8而Python2则是ASCll,因此对不同的版本对于UnicodeEncodeError和UnicodeDecodeError的处理也是不一样的!因此对于decode()和encode()的理解和使用也是不一样的!但是两个函数的使用原理是一样的!decode()就是将字节解码成字符,encode()则是相反!值得注意的是字节方便存储和网络传输,而字符用于显示. 对于Python3的编码总结:文本字符全部

python中的字符编码和转换

1.字符编码初识 最初的字符集是ASCII,ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号. 随着计算机技术的普及和发展,255个符号显然不满足全世界国家对符号数量的需求,因此各国开始发展自己的一套编码.那么针对中文: 为了

Python 2中万恶的字符编码

Python2中如果文件存在中文,必须要指定#-*- coding:utf8 -*-或#coding:utf8,否则会报错.那这是为什么呢? 我们知道,在计算机发展初期,计算机只能识别字母,数字和一些基本符号,其使用8位存储空间存储所有的内容,也就是2^8=256个不同的结果,这就是ASCII码.在当时的情况下,并没有想到日后其他语言文字的扩展,随着不断的发展,对计算机的使用越来越广泛,使用8位存储空间早已不能满足人们的日常需求,所以Unicode(万国码)就这样诞生了.顾名思义,Unicode

字符编码和二进制

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill).python3现在编码是unicode. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节) 即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号. ASCII码只能表示255个符号无法将世界上

python基础3 字符编码

本节主要内容: 基本概念 ASCII及其扩展 中文字符编码 unicode 注释 参考网页 基本概念 计算机中储存的信息都是二进制的0/1串,当我们要在计算机中存储诸如英文.中文.标点符号等字符时,需要先把字符转化成二进制的0/1串之后再保存到计算机中:而当我们要读取保存在计算机中的信息时,需要通过一定的方法把里面的二进制0/1串转化成为原先的字符,然后再通过显示器等渠道进行显示. 这里涉及到字符编码的两个基本概念: 字符集(Character Set):指系统支持的所有字符的集合.字符包括涉及

Python基础编程之字符编码、数据类型、列表

目录: python简介 字符编码介绍 数据类型 一.Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者. python的发展历史 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器. 1991年,第一个Pyt

python字符编码文件

字符编码发展 ASCII 255   只支持英文字母和数字,特殊字符   1bytes Unicode     中文和英文               统一2bytes utf-8      中文>3bytes  英文>1bytes bytes类型 文本数据总是unicode由str类型表示,二进制数据则由bytes类型表示 二进制数据用在视频,音频文件以及发送socket网络传输数据等 字符串转成二进制  str.encode("encoding=utf-8") 二进制转

C#编程总结(九)字符编码

C#编程总结(九)字符编码 相信大家一定遇到过乱码的问题,为什么会乱码呢?输出的数据怎么就跟输入的不一样呢? 最近在总结加密问题,也遇到了同样的困扰.所以今天来集中解决这个问题. 什么是字符? 字符是指计算机中使用的字母.数字.字和符号,包括:1.2.3.A.B.C.~!·#¥%……—*()——+等等. 字符集(Charset) 字符集(Charset)是一个系统支持的所有抽象字符的集合. 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 什么是字符编码? 字符编码(Ch

字符编码--小记

ASCII 码 使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符.标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9.标点符号, 以及在美式英语中使用的特殊控制字符.其中: 0-31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行).CR(回车).FF(换页).DEL(删除).BS(退格).BEL(响铃)等:通信专用字符:SOH(文头).EOT(文尾).ACK(确