注意除了英文字母相同,汉字在Unicode编码和UTF-8编码中通常是不同的 。比如汉字的‘中’字在Unicode中是01001110
00101101,而在UTF-8编码中是11100100 10111000
10101101 。
我们祖国母亲自然也有自己的一套标准 。那就是GB2312和GBK 。当然现在挺少看到 。通常都是直接使用UTF-8 。记得我唯一一次看到GB编码的网页,是一个成人网站 。
Python3中的默认编码
Python3中默认是UTF-8,我们通过以下代码:
import sys
sys.getdefaultencoding()
可查看Python3的默认编码 。
Python3中的encode和decode
Python3中字符编码经常会使用到decode和encode函数 。特别是在抓取网页中,这两个函数用的熟练非常有好处 。我的理解,encode的作用 , 使我们看到的直观的字符转换成计算机内的字节形式 。decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式 。如下图 。
\x表示后面是十六进制,\xe4\xb8\xad即是二进制的11100100 10111000
10101101 。也就是说汉字‘中’encode成字节形式,是11100100 10111000
10101101 。同理,我们拿11100100
10111000 10101101也就是\xe4\xb8\xad来decode回来,就是汉字‘中’ 。完整的应该是b'\xe4\xb8\xad',在Python3中,以字节形式表示的字符串则必须加上前缀b,也就是写成上文的b'xxxx'形式 。
前文说的Python3的默认编码是UTF-8,所以我们可以看到 , Python处理这些字符的时候是以UTF-8来处理的 。因此从上图可以看到,就算我们通过encode('utf-8')特意把字符encode为UTF-8编码 , 出来的结果还是相同:b'\xe4\xb8\xad' 。
明白了这一点 , 同时我们知道UTF-8兼容ASCII,我们可以猜想大学时经常背诵的‘A’对应ASCII中的65,在这里是不是也能正确的decode出来呢 。十进制的65转换成十六进制是41 , 我们尝试下:
b'\x41'.decode()
结果如下 。果然是字符‘A’
Python3中的编码转换
据说字符在计算机的内存中统一是以Unicode编码的 。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8 。但其实我比较关心怎么把这些字符以Unicode的字节形式表现出来,露出它在内存中的庐山正面目的 。这里有个照妖镜:
xxxx.encode/decode('unicode-escape')
输出如下
b'\\u4e2d'还是b'\u4e2d,一个斜杠貌似没影响 。同时可以发现在shell窗口中 , 直接输'\u4e2d'和输入b'\u4e2d'.decode('unicode-escape')是相同的,都会打印出汉字‘中’ , 反而是'\u4e2d'.decode('unicode-escape')会报错 。说明说明Python3不仅支持Unicode,而且一个‘\uxxxx’格式的Unicode字符可被辨识且被等价于str类型 。
如果我们知道一个Unicode字节码,怎么变成UTF-8的字节码呢 。懂了以上这些,现在我们就有思路了 , 先decode , 再encode 。代码如下:
xxx.decode('unicode-escape').encode()
测试如下:
可以看到最后输出的UTF-8字节与上面的相同 。尝试成功 。所以其他的编码之间的转换,大概也是如此 。
最后的扩展
还记得刚刚那个ord吗 。时代变迁,老大哥ASCII被人合并,但ord还是有用武之地 。试试ord('中'),输出结果是20013 。20013是什么呢,我们再试试hex(ord('中')),输出结果是'0x4e2d',也就是20013是我们在上文见面了无数次的x4e2d的十进制值 。这里说下hex,是用来转换成十六进制的函数,学过单片机的人对hex肯定不会陌生 。
最后的扩展,在网上看到的他人的问题 。我们写下类似于'\u4e2d'的字符 , Python3知道我们想表达什么 。但是让Python读取某个文件的时候出现了'\u4e2d',是不是计算机就不认识它了呢python编码转换函数?后来下文有人给出了答案 。如下:
推荐阅读
- 女直播技巧,女生直播怎么聊天
- 小猪快跑是什么玩法视频,播放小猪快跑
- 一口游戏王牌竞速的头像,游戏王牌竞速壁纸
- 网络游戏的不公平,网络游戏批评
- linux命令行出现 linux命令行出现菱形
- oracle索引占用的存储空间大小,oracle索引数量多少合适
- 体育游戏大全女生跳舞,女子体育游戏
- 怎么连接宽带不用路由器,怎么连接宽带不用路由器设置
- 怎么mysql与java mysql如何与java连接