Python中的字符串编码转换
紧接上文(为了水文章,把一篇内容拆分为两篇东西来写,也是没谁了。)上次我们说到了字符串(str
)的单位以及编码类型,那么今天我们就继续来看看这个令人头大的字符串编码,在Python中是如何实现它们的相互转换的。
我们首先要知道,在Python3的版本中,是使用Unicode编码类型对字符串进行编码的。
在上一篇的文章中我们已经讨论过了,在三种编码类型中,ASCII编码是只能支持纯英文或是数字以及一些普通符号的输出的,而Unicode以及UTF-8则支持几乎全部的常见字符的输出。
也就是说,我们使用Print()
语句时,是可以直接输出中文或者是英文的str
print("包含中文的str") #在Python3的版本中字符串是以Unicode进行编码的。
正是因为Python3支持Unicode
进行str
编码,所以,Python支持多种字符的输出或是识别。比如我们让Python用五种不一样的语言说出你好这个词。如下:
print('Hello')
print('你好')
print('にいはお')
print('안녕')
print('привет')
输出结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AH6VorZ3-1615036910509)(https://pic.gksec.com/2021/03/06/27cf576f1542d/微信截图_20210306194500.png)]
可以看见,五种不一样的语言,Python都是支持输出的。
ord()与chr()
接下来,我们来一起看看Python中的两个语句,ord()
以及chr()
这两是干啥的呢?
**ord()**获取字符的整数表示
**chr()**把编码转换为对应字符
但是,这两个函数的对字符的编译仅仅只限于单个字符的编译,是不能支持多个字符同时进行编译的。
我们在编译器中尝试一下他们的用法就能比较清楚地知道它们的用法了。如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yfx6fp0-1615036910511)(https://pic.gksec.com/2021/03/06/0217e3791bf1a/微信截图_20210306200107.png)]
如果能过知道字符的整数编码,甚至可以用十六进制写str
就像下面这样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3D5tAQw-1615036910513)(https://pic.gksec.com/2021/03/06/42e3e72f943fe/微信截图_20210306200422.png)]
而关于字符的Unicode字符编码表,大家可以戳一戳下面这个连接去看一看。
https://blog.csdn.net/wusj3/article/details/88839142
而以上说到的两种字符写法完全是等价的。
encode()与decode()
我们上一篇的文章中也提到了两个单位:bit
(比特)以及byte
(字节),而又因为我们Python中的str
是使用Unicode进行编码的,并且一个字符对应若干个字节,所以,如果是要在网络上传播,或是储存到磁盘上,就需要把str
变为以字节为单位的bytes
Python中的bytes
类型用带b前缀的单引号,或者双引号来表示:
X = b'AaBbCc'
这里我们需要注意一点:b'AaBbCc'
与'AaBbCc'
在Python中的输出结果虽然是一样的。但是,bytes
中的每一个字符都只占用内存中的一个字节。
而以Unicode表示的str
通过encode()
函数的方法同样可以编码为指定的bytes
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sd0Zm3qw-1615036910516)(https://pic.gksec.com/2021/03/06/c5bf699ed5c92/微信截图_20210306202828.png)]
反过来,我们在网络或者自己的磁盘上读取到的内容是以bytes
的方式存在,而我们要把它们转换为str
,在Python中就需要用到decode()
这个函数,如下:
而如果bytes
中存在无法解码的字节,那么decode()的方法就会进行报错:
len()
我们使用len()函数可以计算str
或bytes
中的字节数。如下:
红色部分为计算str中的字节数,使用encode()转换字符为bytes,即为蓝色部分即为计算出的字节数。
不难观察出,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
格式化(%)
我们有时候会输出例如:“尊敬的xxx先生/女士,你好。你本月的生活费仅剩xxxRMB,请注意使用!!!”[doge],但是xxx的内容是个不确定的量,也就是变量,
所以我们需要一种格式化字符串的方式
而碰巧的是,Python中格式化字符串的方式,是与C语言相差无几的。都是使用符号 % 来实现的,如下:
既然python中格式化的方式与C是一样的,那么自然,%d,%f,%s等%+字母的组合方式可以代替一些字符的,具体如下表:
如果,你不能经常记起那个字母是代替什么类型的字符,那么可以统统使用%+s组合,因为,这个组合可以把任意的数据类型转化为字符串。
format()和f-string.
format()和f-string这两种方式同样可以进行字符的格式化,
如下:
format()它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多,而f-string它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换。
以上,就是字符串的编码在Python中的表现方式的全部内容,谢谢你能看到这。