python 中的编码encode和解码decode

在学习tcp udp收发时踩了好多个坑,其中一个坑就是关于编码和解码的操作了。
在这里
编码:encode() 将字符按照编码格式编码2进制的操作
解码:decode() 将2进制串按照解码格式解码成相应的字符的操作
在进行通讯时,收发数据是按照2进制进行收发的,在发送数据之前,数据要先经过编码 encode()
在通讯之后,收到的数据是2进制的,如果是汉字之类的如果不经过解码,print时看到的会是乱码,要经过decode() 按照相应的规则解码,才能打印出可以显示的字符

关于utf-8和unicode的
常见的编码包括:
ascii码:7bit表示128个字符,只能用于英文
unicode:万国码 包含了所有的字符编码
Unicode是用0至65535之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.65536是2的16次方.这是第一步.第二步就是怎么把0至65535这些数字转化成01串保存到计算机中.这肯定就有不同的保存方式了.于是出现了UTF(unicode transformation format),有UTF-8,UTF-16.
utf-8: 英文依旧是占1个字节,但是其他的需要用3个字节表示
utf-16:所有的都是占2个字节
所以对于英文占大多数的内容,用utf-8更好
对于汉语占绝大多数的内容,用utf-16更好
utf-8 utf-16的解释很清晰的一篇博文
但是utf-16覆盖了65535字符,目前unicode收录的字符已经有9万多了,是覆盖不到的
其中的一部分内容摘录(侵删)
反过来 UTF-8 也不完美,也存在一些问题:

文化上的不平衡——对于欧美地区一些以英语为母语的国家 UTF-8 简直是太棒了,因为它和 ASCII 一样,一个字符只占一个字节,没有任何额外的存储负担;但是对于中日韩等国家来说,UTF-8 实在是太冗余,一个字符竟然要占用 3 个字节,存储和传输的效率不但没有提升,反而下降了。所以欧美人民常常毫不犹豫的采用 UTF-8,而我们却老是要犹豫一会儿
变长字节表示带来的效率问题——大家对 UTF-8 疑虑重重的一个问题就是在于其因为是变长字节表示,因此无论是计算字符数,还是执行索引操作效率都不高。为了解决这个问题,常常会考虑把 UTF-8 先转换为 UTF-16 或者 UTF-32 后再操作,操作完毕后再转换回去。而这显然是一种性能负担。
UTF-16 并不是一个完美的选择,它存在几个方面的问题:

UTF-16 能表示的字符数有 6 万多,看起来很多,但是实际上目前 Unicode 5.0 收录的字符已经达到 99024 个字符,早已超过 UTF-16 的存储范围;这直接导致 UTF-16 地位颇为尴尬——如果谁还在想着只要使用 UTF-16 就可以高枕无忧的话,恐怕要失望了
UTF-16 存在大小端字节序问题,这个问题在进行信息交换时特别突出——如果字节序未协商好,将导致乱码;如果协商好,但是双方一个采用大端一个采用小端,则必然有一方要进行大小端转换,性能损失不可避免(大小端问题其实不像看起来那么简单,有时会涉及硬件、操作系统、上层软件多个层次,可能会进行多次转换)
另外,容错性低有时候也是一大问题——局部的字节错误,特别是丢失或增加可能导致所有后续字符全部错乱,错乱后要想恢复,可能很简单,也可能会非常困难。(这一点在日常生活里大家感觉似乎无关紧要,但是在很多特殊环境下却是巨大的缺陷)
目前支撑我们继续使用 UTF-16 的理由主要是考虑到它是双字节的,在计算字符串长度、执行索引操作时速度很快。当然这些优点 UTF-32 都具有,但很多人毕竟还是觉得 UTF-32 太占空间了。

跑题了:以下继续进行编码和解码的相关操作:

编码和解码的描述:
编码使用的gbk,解码时也需要用gbk,
编码时用的utf-8,解码时也需要用utf-8
不能混用

value = '穆魂'
#value = 'lcy'
print('value=',value)
value_utf8 = value.encode('utf-8')
print('utf-8',value_utf8)
value_gbk = value_utf8.decode('utf-8').encode('gbk')
print('gbk',value_gbk)
value_utf8_2 = value_gbk.decode('gbk').encode('utf-8')
print('utf-8',value_utf8_2)

将utf-8编码转为gbk编码,要先将utf-8编码解码,再按照‘gbk’编码方式编码
编码和解码类似于发电报:
我军和敌军在作战时通过电报和各自的指挥部交流
我军发的电报,加密后敌军是看不懂的,发到我军的指挥部,指挥部能够按照相应的解码方式解码之后,就变成了可以理解的字符;
敌军也一样
如果,我军的特工潜入敌军指挥部,带回了敌军的密码本,我军就可以截获敌军的电报,进而解码敌军的报文成内容,然后将内容再编码成我军的报文发给我军的部队……
这就是解码,最初两军的编码是不同的,如果能够截获敌军的报文,并且按照相应的编码改出来,那我军就知道了敌军的动向

GBK:收录2000+汉字 windows,如果中文默认选择的编码格式就是gbk编码
unicode:存中文字符和英文字符默认占2个,但是utf-8 英文1个 其他3个 英文字符和ascii码是一样的
asill码:只有英文,一个英文字符占1个字节

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值