开发者学堂课程【Python 入门 2020年版:字符串的编码集】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10288
字符串的编码集
内容简介:
一、字符编码
二、编码规则
一、字符编码
1.ASCII → Latin1 → Unicode编码
2.字符 → 数字编码存在一个对应的关系
3.使用内置函数 chr 和 ord 能够查看数字和字符的对应关系
(1)ord 获取字符对应的编码 ; chr 根据编码获取对应的字符
例如:
①print(ord( 'a' ))
运行: 97 (字符对应的编码)
②print(chr(65))
运行: A
③print(ord( '你' ))
运行: 20320
bin(20320) → 0b100111101100000
二、编码规则
使用 Unicode为每种语言的每个字符都设定了唯一的二进制编码,但是它还是存在一定的问题,不够完美。
例如,汉字“你" 转换成为一个字符结果是 ex4f6e ,转换成为二进制就是01001111 01100000,此时就有两个问题:
1.1001111(表示一个 Latin1符) 01100000(表示一个 Latin1符)
(1) 你占了两个字节,那么到底是一个汉字“你" , 还是两个 Latin1字符?
(2)假如规定所有的字符都使用16位,2个字节来表示.
例如:
00000000 01001111 → Latin
00000000 01100000 → Latin
以上有两个问题:
①00000000浪费了很多
②不是所有的字符都能用16位表示,可能还不够
例如:
若11100000 1001111 01100000
则: 00000000 00000000 01100000 → Latin
(2) 假如规定所有的字符都使用24位,3个字节来表示,则前面补的0更多,效率、存储的量就加大,也就更麻烦.
(3) 如果 Unicode进行了规定,每个字符都使用 n个八位来表示,对于 Latin1字符来说,又会浪费很多存储空间。
2. 为了解决这个问题,就出现了一些编码规则,按照一定的编码规则对 Unicode数字进行计算,得出新的编码。
在中国常用的字符编码有 GBK(国标扩,一个汉字占两个字节,简体中文),BIG5(繁体中文)和 utf-8(统一编码,一个汉字占三个字节,基本可以编世界上所有的语言)这三种编码规则。
3. 使用字符串的 encode方法,可以将字符串按照指定的编码格式转换称为二进制;使用 decode方法,可以将一个二进制数据按照指定的编码格式转换成为字符串。
例如:
(1)print( '你' , encode( 'gbk' ))
运行: b'\xc4\xe3'
(2)print(0xc4e3)
结果: 50195
①转化为二进制:
bin(0xc4e3)
结果: '0b1100010011100011'
②转化为十进制:
print(0xc4e3)
结果: 50403
(3)print( '你' . encode( 'utf8' ))
运行: b'\xe4\xbd\xa0'
①变回:
x = b'\xe4\xbd\xa0'
print(x.decode( 'utf8' ))
运行: 你
②转化为二进制:
bin(0xe4bda0)
结果: '0b111001001011110110100000'
4.什么叫乱码?
首先创建一个 txt文档,用 Edit with Notepad++软件打开,写一个你好保存,那么文件是以什么编码格式保存,则用 Edit with Notepad++软件打开,就可以看到是使用 UTF-8编码保存的,把你好删除保存,修改编码,点击编码字符集,用中文 GB2312(Simplified)打开,用 UTF-8读,再次在文本框中输入你好,则会出现乱码,当然以下方法也可以验证乱码:
(1)把 '你好' . 使用 gbk编码
①y = '你好' . encode( 'gbk' )
print(y)
运行: b '\xc4\xe3\xba\xc3\'
变回:
print(y. decode( 'gbk' ))
运行: 你好
②y = '你好' . encode( 'gbk' )
print(y. decode( 'utf8' ))
报错,当然也不是所有的都会报错
③y = '你好' . encode( 'utf8' ) → utf8一个汉字转换成为三个字节
print(y)
运行: b '\xe4\xbd\xa0\xe5\xa5\xbd'
变回:
print(y. decode( 'gbk' )) →gbk一个汉字占两个字节
运行: 浣犲乀 #之所以会变成这样,是因为把\xe4\xbd转变成了一个字, \xa0\xe5转变成一个字, \xa5\xbd转变成一个字,则此时六个字节就变成了三个字
变回:
In : b'\xe4\xbd\'.decode( 'gbk' )
out : '浣'
print(y.decode( 'utf8' ))
运行:你好
#txt文本乱码,修改字符集,若是用 word则不能用记事本打开,会出现乱码,因为 word不止是我们写的字,它还有很多其他隐藏的特殊的东西.