什么是字符编码
计算机里面是由各种电子电路组成的,它是如何识别我们的写的字符的,比如hello ,你,我。
直接识别是不可能,它只能识别 二进制的0,1字符。所有我们输入进去的字符,最终都会被转化成0,1这种组合在一起的一串数字。
计算机存储信息的最小单位,称之为位(bit),又叫比特,二进制的一个“0”或一个“1”叫一位。
8个二进制位组成1个字节(Byte),1024字节(Byte)也就是1KB,1024KB是1M,这就是我们平常说的文件大小的单位(M),比如这个图片大小5M。
既然计算机是通过二进制的数字来识别不同字符的,那不同的字符该用多少个1和0,又该以什么样的顺序来排列呢?
为什么要字符编码
这里为了规范,就出现了ASCII编码。ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
这里的编码规定了,每个字符由几个0和1组成,顺序也定下了。里面包含了控制字符或通信专用字符,阿拉伯数字,大小写英文字符,标点运算符号等,一共128个。
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
了解进制数
进制也就是进位计数制,是人为定义的带进位的计数方法。对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
下面就来通过python中自带的函数一起来验证一下。
理解:
ord() 函数:以一个字符串作为参数,返回对应的 ASCII 数值。
chr()函数:用一个整数作参数,返回一个对应的字符。可以二进制,十进制,十六进制。
不理解进制数的可以自己去学习一下,或者利用python自带的进制转换函数去试一下。
0b 开头表示二进制,0o表示八进制,0x表示十六进制,通过内置进制函数可以相互进行转换。
Hello这样的一个词语要被计算机认识,只要按照ASCII编码来就可以了。对应的16进制编码是:48 65 6C 6C 6F
编码的种类
百度百科:
在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号 [5] 。 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段 。 至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号 。
因为ASCII不够用了,所以需要扩展字符集。
百度百科:
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、ShiftJIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 ShiftJIS 编码。[1] 简单的说,在简体中文系统下,ANSI编码代表GB2312编码;在日文操作系统下,ANSI编码代表JS编码。[2] 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。
但是这么多编码,很混乱,不同 ANSI 编码之间互不兼容,不同语言交流时会出现乱码。为了统一所有文字的编码,Unicode诞生了。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
虽然统一了所有字符,但是在存储和传输的时候,也带来了一些缺点,如果你传输的都是英文字符,使用unicode编码就会使用更多的字节,所以后面实现了utf-8编码,可以根据字符的情况进行可变的字节表示。
在文件保存的时候,其实是可以看见有编码选择的,平时可能不是很关注,读写文件出现编码格式错误,就可以从这方面来思考解决。
编码和解码
utf编码读取文件
ANSI读取文件/gbk
utf-8 带 bom读取
忽略错误会出现乱码
使用utf-8-sig编码可以解决这个问题
encode:将 Unicode 字符串转换为特定编码格式对应的字节码的过程
decode:将特定编码格式的字节码转换为对应的 Unicode 字符串的过程
Python3 的默认编码为 Unicode。
编码检测
有时候解码格式报错,但是我们并不知道它是什么编码,那该怎样解码?可以通过chardet这个模块来检测我们文件数据的一个编码格式,结果会显示可信度。
(全文完)