Skip to content

计算机编码

约 833 个字 预计阅读时间 3 分钟

计算机常见编码规则

ascll

单字节存储,实际数据存储空间是7bit,最高位是奇偶校验位

Note

奇校验,使数据序列(包括校验位)中的1的个数为奇数,偶校验同理。它的用处在于假设约定使用奇校验,发送端发送的一个字符编码中1的个数一定为奇数,在接收端对1的个数进行统计,如果统计出来的结果是偶数个,那么说明传输过程中有奇数位错误(但是一般多位出错的可能性很低)

Latin1

也是单字节编码,向下兼容ASCLL,没有校验位,8个bit全部用来编码,正是因为Latin1使用了所有bit,所以使用Latin1接受其他任何编码的字节流都不会有任何信息被抛弃,换言之也就是可以用Latin1接收任何字节流。

MySQL 5.5之前会默认使用latin1编码,高版本已经是默认utf8了

Unicode

Note

Unicode只规定了有哪些字符和它们的编号,并没有规定怎么存储这些编号,即怎么编码,utf-8这种才是具体的实现方案。

将世界上所有的字符都纳入其中,给每一个符号一个独一无二的编码,这样可以避免乱码。

因为Unicode要存非常多的字符,而且会不断变多,我记得是可以向Unicode委员会提交你设计的表情的,(一个著名的例子就是男人怀孕因为某些政治因素秒过审核),所以它的编码规则自然是有特殊设计的

基础形式是U+xxxx,四位十六进制数,也就是可以表示$(2^4)^4=2^16=65536 $个字符,但是这个数目显然不够,所以Unicode引入了分区存储的概念,这个区被称作平面(plane),目前一共有十七个平面,也就是目前unicode字符集大小是 $2^{16}*17=1,114,112 $,表示平面就在前面再加一位(0号平面不需要,故一共有17个平面)

utf-8

utf-8(8-bit Unicode Transformation Format)目前互联网使用最广的编码方式,它的最大特点是可变长,使用1-4个字节表示一个字符,它支持全球几乎所有语言的字符(包括中日韩、表情符号等)

GBK

GBK全称是扩展的《汉字内码扩展规范》,主要支持简体中文,扩展后包括繁体和部分日文汉字,缺点很明显:不兼容 ASCII 的后续多语言需求;不是 Unicode 编码,跨平台支持差,故不推荐使用

乱码

通过一种字符编码来解读另一种字符编码的字节流,就会导致解读出来的字符并非预期,从而产生所谓“乱码”。

常见的乱码情况有:

  • 用 GBK 解码 UTF-8 编码的文本
  • 用 UTF-8 解码 GBK 编码的文本
  • 用 latin-1 解码 UTF-8 编码的文本
  • 用 latin-1 解码 GBK 编码的文本
  • 先用 GBK 解码 UTF-8 编码的文本,再用 UTF-8 解码前面的结果
  • 先用 UTF-8 解码 GBK 编码的文本,再用 GBK 解码前面的结果