对编码的理解与Python编码

Python编码与对编码的理解

编码顾名思义,是对二进制码进行操作,一切都是以此为基准,最开始理解错了,走了很多弯路。

编码发展史

美国人发明了计算机,用八位0和1的组合,一一对应英文中的字符,整出了一个表格,ASCII表。
计算机传入中国,中国地大物博,繁体字和简体字多,8位字节最多表示256个字符,满足不了,于是对ASCII扩展,新表叫GB2312
后来发现GB2312还不够用,扩充之后形成GB18030。
每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
各自编码无法国际交流。一个国际组织一起创造了一种编码 UNICODE(Universal Multiple-Octet Coded Character Set)规定所有字符用两个字节表示,就是固定的,所有的字符就两个字节,计算机容易识别。
UNICODE虽然解决了各自为战的问题,但是美国人不愿意了,因为美国原来的ASCII只需要一个字节就可以了。UNICODE编码却让他们的语言多了一个字节,白白浪费一个字节的存储空间。经过协商,出现了一种新的转换格式,被称为通用转换格式,也就是UTF(unicode transformation format).常见的有utf-8,utf-16。utf-8规定,先分类,美国字符一个字节,欧洲两个字符,东南亚三个字符。

二进制流与字符流与字节流

流:表示任意输入的或任意输出的目的地
数据传输流都是二进制流
字节流是指流动的是二进制数字序列
字符流是指流动的是编码了的二进制数字序列(正如开头所强调)
文本协议,一个字符至少占了一个字节,最小单位为byte)
例如2020这个数,在字符流中用其ASCII码表示为
50 48 50 48 (10进制)
00110010 00110000 00110010 00110000 (2进制)
占4字节
在字节流中,可直接表示为(二进制协议常用,最小单位为bit,如加密机)
00000111 11100100 (2进制)
07 E4 (16进制)
占2字节
字节流大大节省了空间
如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点

系统间报文与编码

若A系统采用GBK,B系统采用UTF-8显示,A系统传给B的“报文内容将被修改”,内部的二进制序列已经被修改,而由于UTF-8和GBK都是ASCII编码的扩展,所以B系统可以正常查看英文,但中文是乱码。
若传递一些英文信息,是没有问题的,但如果涉及签名,签名要素的一些信息(签名是对签名要素的二进制序列做散列算法再加密),就会出现问题,此时一定要注意编码统一性。

python编码

python中有两个类型,bytes和str,byte就代表字节类型,显示中无法对应ASCII的用16进制表示,str就代表编码的字符串。

encode()和decode()

在这里插入图片描述
encode() 方法用于将 str 类型转换成 bytes 类型(默认采用UTF-8编码)
与encode()类似,bytes 是一个类,调用它的构造方法,也就是 bytes(),可以将字符串按照指定的字符集转换成 bytes;如果不指定字符集,那么默认采用 UTF-8
decode() 方法用于将 bytes 类型的二进制数据转换为 str 类型(默认采用UTF-8编码)
若bytes中的16进制值不在utf-8平面范围内,则会失败,使用errors="ignore"参数会忽视并吞掉无法转换的字节
在这里插入图片描述
python3默认编码是utf-8,内存里(也就是字符串) 是编码是unicode,即使声明了某种编码,在内存里还是unicode
而python2默认编码是ascii,执行下列操作会报
‘ascii’ codec can’t decode
在这里插入图片描述
utf-8虽然压缩了存储空间,但是如果在内存中存储,使用utf-8却由于它的长度不固定,带来了很大的不便,使得在内存处理字符变得复杂。应对这个问题的解决策略是:在像Java、Python3之类的比较高级一点的语言,字符串对象在内存中通常是用UTF16表示的(UTF-16在bmp中用两字节表示所有字符,等同于UCS-2,不在bmp则扩充为4字节),当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码,因为unicode编码的长度固定,处理起来很方便。而在文件的存储中,则使用utf-8编码,可以压缩内存,节省空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值