Python基础:编码表和字符的故事

在计算机内部,都是每8位组成的一个个字节,比如我们使用"abc".encode()把abc转化成二进制byte类型,注意byte是不可变类型:
在这里插入图片描述

编码过程

>>> abc.encode() 
 
# 把str字符变为bytes字节类型;字符是一个个连接的,转化出来的bytes也是一个个连续的。
b'abc'
>>> "阿".encode("utf-8")  # 一个汉字 uft-8里多是3个字节
b'\xe9\x98\xbf'
>>> "阿".encode("gbk")  # 一个汉字 gbk里是2个字节
b'\xb0\xa2'

解码过程

>>> b'\xe9\x98\xbf'.decode() #使用默认的utf-8 进行解码
'阿'
>>> b'\xb0\xa2'.decode("gbk") # 因为刚才是用gbk编码的,我们就用gbk解码,否则就会乱码
'阿'
>>> b'abc'.decode()
#  **这里要注意不要看这里的abc**,这里的abc只是一种展现形式,
#因为这只是二进制的展示形式
'abc'

ASCII 码

从0到127,共128种变化。它是用1个字节(1个字节有8位)表示的。
关于8位,就是从0000 0000到1111 1111组成的数字,最高位不动,剩下的低7位变化,所以共有(2的8次方,1 0000 0000,即128)种状态,即0-127,其中127对应的就是0FFF FFFF。

为了用计算机表达字符,人们建了对照表。
比如1,对于计算机来说,计算机里原本是0000 0001,我们告诉计算机不要把0100 0001当65看了,请把它当a看

类似这样比较常见建议背诵的有:

  • 09>>> TAB
>>> c = "\t" # 转义字符的tab
>>> c
'\t'
>>> c = "\x09" # 十六进制的9
>>> c
'\t'
  • 0d0a >>> 回车换行 # 即十进制的1310
>>> d = "\r\n"
>>> d
'\r\n'
>>> d = "\x0d\x0a"
>>> d
'\r\n'
  • 0x20>>>空格 即decimal 32
>>> e = " "
>>> e
' '
>>> e = "\x20"
>>> e
' '
  • 阿拉伯数字0x31 >>>字符1 即decimal 49
>>> c =1 # 整数1与ascii码表无关
>>> d = "1" # 字符1,那就要查表
>>> d
'1'
>>> d = "\x31"
>>> d
'1'
  • A >>> 0x41 即 65

  • a>>> 0x61 即97

>>> x = "\x41"
>>> x
'A'
>>> y = "\x61"
>>> y
'a'
# 举例
>>> z = "a\x09b\x0d\x0ac \x31\x41\x61" 
# 相当于z = 'a\tb\r\nc 1Aa'
>>> z
'a\tb\r\nc 1Aa'

单字节的故事:欧美国家

ASCII码0-127低8位解决了英语问题,欧洲法国德国俄国西班牙等,就用了高8位,各自解决了自己的信息化问题:即低8位兼容ascii码,高8位各自为政 高八位加低八位共一个字节。

双字节的中文GB2312>>GBK

仅仅能够解决英美国家拉丁文等字母文字的编码,但无法解决中文体系的方块字,因为方块字的数量太多了。一个字节不够,于是我们开始使用2个字节即65536种状态表达汉字。
为了兼容ASCII码,汉字是把双字节的每一个0x80之前的都让过的。比如啊,\xb0\xa1,每个字节都高于0x800x80。
GB2312汉字数量较少(也包含了部分日文),最后发展成了GBK,现在window内部使用额就是双字节的GBK。

双字节的统一:unicode

Unicode和iso都可以实现用双字节把全世界已知字符收录,后来合二为一成为Unicode。
Unicode和GBK之间存在映射关系

互联网时代,双字节的进化-utf-8

Unicode始终是双字节,这样本来用单字节表达的字母,也需要用双字节,影响了网络时代的网络传输。
于是适应网络时代的utf-8出现了,utf-8有1-6个字节兼容了所有字节,ascii码依然是单字节;中文字符大多落在3个字节。

last not the least: str在字符的世界中,是有编码的,要查编码表;
bytes在字节的世界里,只有一个个字节,没有编码。

今日鸡汤: 标准之争才是至高争夺。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值