什么是字符编码
我们知道编程就是我们人类给计算机发送指令让计算机进行计算,先抛开我们怎样给计算机发指令这个问题不说,你发的指令计算机总得能听懂吧,计算机不像我们人类,在它的世界里只有一种语言,那就是0或1(高低电平两种状态),其实就是二进制数。
ok,那我们定个标准吧,用哪些二进制数来表示哪些符号,这样你对计算机说一个二进制数它就会知道你要发送的指令了。其实此时我们手中这个二进制和符号的对应表就能称为一个编码表了,你有你的编码表,我有我的编码表,我对我的计算机发指令它能根据编码对应关系识别出来,我用你电脑的时候发指令如果不按照你的对应关系发,它肯定听不懂我的话啊,咱俩的表一样不就完了么,老铁
ASCII
计算机是美国人发明的,上边的问题美国人遇到了,然后他们就建立了第一个编码表,
ASCII表,这个表建立的早啊,没想那么多,所以只有英文字母数字和一些字符与二进制数字的对应关系:
二进制大家都知道 0000 0001
这样的一个8位2进制数,它转换成10进制其实有256个值,ASCII码就是用8位2进制来表示所有的符号的,也就是说ASCII编码表最多只能表示256个符号,8位二进制也叫一个字节,所以也可以说ASCII用一个字节代表一个字符
这个表的对应关系大家都能看懂吧
图片.png
其他字符编码
ascii可以编程了,好,各国开始用它做编程,问题来了, 每个国家都有每个国家的语言不可能每个国家都用英文啊,这时候每个国家的科学家们又建立了一种自己用着舒服的字符编码,举个栗子
中国规定了自己的标准,GB2312(其中包含了中文和数字对应关系)
日本也有自己的标准,Shift_JIS
unicode
每个国家现在都有了自己的字符编码,如果小明精通8国语言,用8中语言来编写程序的话,计算机还能听懂么,所以就有了一个包含世界所有语言和数字对应关系的标准,伟大的unicode
优点:精通世界所有语言,无论谁用这套标准都可以操作计算机
缺点:如同厚厚的新华字典,占用空间大(一般用两个字节(16位二进制)代表一个字符,生僻字的话还要用4个字节)
utf-8
好了,用了unicode我们现在可以随心所欲的编程了,再也不用担心计算机乱码了,但是别忘了,unicode有一个缺点,就是占用空间大,无论存储还是传输的时候都是弊端,于是有了utf-8(可变长编码),utf-8的可变长体现在:一般常用的英文用1个字节表示,汉字通常是3个,只有特别生僻的字采用4-6个字节,如果要传输的文本包含大量英文,用utf比unicode节约的空间可不是一点点
文件乱码问题
我们对计算机当中文件的修改都是通过把文件加载到内存中去操作的,这里在内存中的编码当然是unicode(不管你是什么编码,通通一把梭),但是操作之后,如果把文件存储或者传输的话,就要考虑文件的大小了,所以为了空间考虑,在存盘的时候要把unicode转变成utf-8格式(一般来说都是utf-8,你也可以填你喜欢的)
如果我们存的时候用utf-8,拿出来读的时候也要是utf-8,否则就会乱码,比如:
图片.png
所以,想要不乱码:用什么方式编码的,就要用什么方式解码
str和bytes类型
str 字符串类型(存在于内存中,我们可以操作)
bytes 比特流,存在形式是二进制(用于存储和网络传输)
a = "好"
b = a.encode("utf-8")
print(b) # b'\xe5\xa5\xbd' 把字符串编码为比特流,默认是16进制
c = b.decode("utf-8")
print(c) # 好 ,把bytes 解码转化为字符串,解码的编码为utf-8'''```
网友评论