ASCII,UTF-8,GBK 及 Python3中的编码解码

版权声明:本文为博主原创文章,未经博主允许不得转载。如有错误,欢迎指出~(@^_^@)~ https://blog.csdn.net/zwj1452267376/article/details/85074719

背景

信息在传输过程中实际上是由低电频与高电频的组合来表示的,高低电频对应到计算机中就是数字0与1。所以就可以将若干个0和若干个1组合起来表示一个字符。

例如,我们可以设定0000表示a0001表示b0010表示c

这就像是编写一个密码本,每一个密文元素都有其相对应的明文元素。
但是信息传输双方拥有不同加密规则的密码本,纵使信息成功传输与接收,对方也不能知道文本包含的准确信息。所以就要在行业内制定出统一的编码规则。在这样的背景下 ASCII 编码就诞生了。


ASCII

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

因为英文中字母和数字个数很少,ASCII 码被设计出来的时候,有效位只有7位,一共能表示128 (27)个字符(包含字母与各种符号)。但是设计者考虑到计算机的发展,又添加了一位,一共8位,可以表示256(28)个字符。所以在 ASCII 二进制编码中第一位数字都是0。

例如,在 ASCII 码中:
0000 0000表示NUL(NULL空字符)
0010 0001表示!
0100 0001表示A
0100 0010表示B
0110 0001表示a

ASCII 码是针对英文字符设定的,在计算机中一个0或者1占据内存空间为 1bit,所以一个英文字符大小为 8bit,即 8bit(比特) = 1byte(字节)。

  • 8bit = 1byte
  • 1024byte = 1KB
  • 1024KB = 1MB
  • 1024MB = 1GB
  • 1024GB = 1TB

然而随着计算机向全世界普及,原本的 ASCII 码就无法将世界上的各种文字和符号全部表示了。于是就需要新出一种可以代表所有字符和符号的编码,即:Unicode。而由 Unicode 的不断改善发展,又有了 UTF-8 。


UTF-8

Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

UTF-8

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存…

在 UTF-8 中一个汉字占三个字节(24位),英文字母占一个字节(8位)


GBK

gbk 编码 中国人自己发明的,一个中文用两个字节(16位)去表示,英文字母占一个字节(8位)


注:

1,各个编码之间的二进制,是不能互相识别的,会产生乱码。
2,文件的储存,传输,不能是unicode(只能是utf-8 utf-16 gbk,gb2312,asciid等)


Python3 中的编码解码

str 与 bytes

Python3 中的字符串在内存用使用的是Unicode编码,是以字符为单位进行处理的。而在Python3中还有一种数据类型 bytes,是以字节为单位进行处理的。

bytes 通常用于网络数据传输、二进制图片和文件的保存等等。可以通过调用bytes()生成bytes实例,其值形式为 b’xxxxx’,其中 ‘xxxxx’ 为一至多个转义的十六进制字符串(单个 x 的形式为:\x12,其中\x为小写的十六进制转义字符,12为二位十六进制数)组成的序列,每个十六进制数代表一个字节(八位二进制数,取值范围0-255),对于同一个字符串如果采用不同的编码方式生成bytes对象,就会形成不同的值.

s = 'python'
print(s, type(s))
# python <class 'str'>
bs = b'python'
print(bs, type(bs))
# b'python' <class 'bytes'>
s1 = '人生苦短'
print(s1, type(s1))
# 人生苦短 <class 'str'>

# bs1 = b'人生苦短' 这么写会报错,bytes只能包含ASCII码中的字符

编码与解码

str.encode(encoding='UTF-8',errors='strict') 以指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。返回编码后的字符串是一个 bytes 对象。
bytes.decode(encoding="utf-8", errors="strict")以指定的编码格式解码 bytes 对象。默认编码为 ‘utf-8’,并返回解码后的字符串。

s = 'python'
bs_utf = s.encode('utf-8')
print(bs_utf)  # b'python'
bs_gbk = s.encode('gbk')
print(bs_gbk)  # b'python'

sc = '蛇'
bsc_utf = sc.encode('utf-8')
print(bsc_utf)  # b'\xe8\x9b\x87'
bsc_gbk = sc.encode('gbk')
print(bsc_gbk)  # b'\xc9\xdf'

print(bs_utf.decode())  # python
print(bs_gbk.decode('gbk'))  # python

print(bsc_utf.decode())  # 蛇
print(bsc_gbk.decode('gbk'))  # 蛇

猜你喜欢

转载自blog.csdn.net/zwj1452267376/article/details/85074719