python中的编解码

下面写的都是自我理解的,如有错漏,欢迎指正

本文主要涉及:unicode、utf-8、ascii码、b''、\u、\x   这些经常用的,之间的转换及含义

 

先来一些概念: 

  • unicode、utf-8、ascii是编码类型,由于计算机只识别0和1,所以自然界的问题,在计算机中处理,需要编码成这些类型。

  • ascii码是最开始的,美国人用的包含26个字母及其他的一些符号的,只有1个字节。

  • unicode是包含了其他国家,例如中文,韩文,日文等的一些,通常有2个字节,有些有4个字节。

  • utf-8是本着节约的精神,在unicode的基础上做优化的,兼容ascii码。

 

1 python2和python3的字符串默认编码

1.1 通过ord获取字符的码号(python3) 

>>> ord('你')   # ord展示字符的unicode 10进制码号
20320
>>> hex(20320)
'0x4f60
>>> ord('好')
22909
>>> hex(22909)
'0x597d'

1.2 交互模式下的显示中文(python3)

直接写字符串使用\u的形式使用u''的形式  
>>> '你好'
'你好'
>>> u'\u4f60\u597d'
'你好'
>>> u'你好'
'你好'
>>> u'你好'.encode('utf-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd'
 

1.3 创建一个简单的python文件

[root@localhost:/home/lynalee]$ cat aa.py
a = '你好'
print(a)

分别调用python2和python3进行观察

[root@localhost:/home/lynalee]$ python2 aa.py
  File "aa.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file aa.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
[root@localhost:/home/lynalee]$ python3 aa.py
你好

作者结论:

  • python3默认使用unicode编码字符串,而python2使用的是ascii码

  • 我认为文件开头的encoding='utf-8'应该只需要在python2中使用(还没测试)

  • unicode通常为2个字节,有时候为4个字节(不知道是如何区分的呢?)

1.4 如何区分unicode的2字节和4字节字符?(# 没有做测试)

在网上看到的一句,4字节字符的前两个字节范围是d800-dbff,后两个字节范围是dc00-dfff

 

 2 unicode与utf-8与b''

\u表示unicode编码

\x为16进制

b''为python中的byte表示,一般用于网络传输

2.1 三者的转换

三者的关系,可以通过下图观察。

作者结论:

  • encode将字符串编码成了'utf-8'的格式,成了一个个字节,一般我们打开文件(open),可能会指定encoding=utf-8,表示文本是以此编码格式进行存储在硬盘中的。

  • unicode不等同于utf-8

  • 可以看到上面的从unicode的四字节,变成了utf-8的六字节,所以也论证了个说法,即在英文多的情况下用utf-8比较节省,中文多的情况下unicode可能才更节省。

3 unicode兼容ascii码的测试

>>> 'sp\x61m'
'spam'
>>> u'sp\u0061m'
'spam'

unicode兼容ascii码,所以只需要在前面补'0'就可以打印出对应的值

  • \x为十六进制,后面紧跟一个字节,一个字节8位,2**8=256=16*16,所以后面跟两个16进制字母

  • \u通常为两个字节,所以后面是4个16进制字母

  •  b''流用于在网络中传输,都是单个字节的,收端使用相应的编码进行解码。

 

4 python的显示自动优化

>>> '\x61\x62\x63'.encode('utf-8')
b'abc'
>>> 'abc'.encode('utf-8')
b'abc'
>>> '你好'.encode('utf-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd'

理论上来说,使用了encode方法,那应该返回字节码才对,但返回的仍然是原本的'abc',这其实是因为python做了展示的优化,能用ascii码表示的字符,都会如此展示(ps:我个人觉得还不如不展示,容易使人迷惑)。如果是中文的话,就仍会返回\x这种形式

posted @ 2022-05-25 10:55  lynalee  阅读(410)  评论(0编辑  收藏  举报