开发过程中,有时会遇到乱码的情况,然后不知道为什么,对编码没有了解,遇到问题的时候也就一脸懵逼了,这篇文章对编码做了一个汇总。
一开始
写代码的时候,编码出问题的时候,就知道把编码设置为UTF-8,为啥呢?不知道。了解完编码之后,才不会只熟悉编码的拼写。
字符
说编码之前,我们要先来了解一下字符
什么是字符?
字符:字符很简单,其实就是一个表示,比如:中文字符、英文字符...
然后,什么是字符集
字符集:字面上理解,就是具体共同特征的字符的集合
编码
说完字符之后,我们来看一下什么是编码
编码 = 占用存储 + 编码表
首先,看一下什么占用存储?即规定一个字符用多少个字节来显示,为什么呢?因为计算机只能处理0|1数据,所以我们要规定占用存储。
占用存储:规定一个字符用多少个字节来显示
然后,来看一下什么是编码表,编码表这个就容易了,就是规定哪个字符对应哪个编码。
编码表:规定字符集种每个字符的对应关系
编码说完了,我们来看一下编码格式。
ASCII(美国标准信息交换代码)
说起编码,第一个肯定要说到ASCII,这个应该是我们接触的第一个编码格式。
- 一个字节(7/8位)
- 定义128个字符(显示字符95个,非显示字符33个)
由于ASCII只定义了英文字符,中文等其他复杂的字符不能表现,所以有了ASCII的扩展,如GB2312、GBK。
GB2312(信息交换用汉字编码字符集)
GB2312,对ASCII扩展之后,支持中文。
- 双字节
- 区位码表示(94区&94位)
- 收录汉字6773个
GBK(汉字内码扩展规范)
由于GB2312只有简体中文,不能有繁体或者日文之类的,所以又扩展了GBK。
- GB2312的扩展
- 双字节
- 收录汉字21003个(支持中日韩汉字)
GB18030(汉字编码国家标准)
汉字的总数其实非常多,像少数名字的汉字并没有在GBK中,所以后面又扩展了GB18030。
- 单/双/四字节 同时支持
- 补充多名族语言(藏、蒙古、傣、彝、朝鲜、维吾尔文等)
- GB18030-2000:收录汉字27533个
- GB18030-2005:收录汉字70244个
Unicode-字符集
ASCII的扩展,只能满足一部分的需求,当国际化出现的时候,发现兼容不了,所以就出现了Unicode字符集,又称统一码、万国码、单一码。是对全世界语言的字符集合。
- 用U+ 紧接一组16进制的数字表示(如:
U+4AE0
) - 基础表示都在0号平面,另外扩展16个平面,在16进制前面多加一个字节表示(如
U+3FFFF
)
Unicode的编码有三种,区别在于用多少个字节表示
- UTF-8:可变长
- UTF-16:大部分2字节
- UTF-32:4字节
UTF-8
UTF-8是Unicode编码中最常用的一种,这里我们主要介绍UTF-8
下面我们看下怎么将Unicode编码成UTF-8
我们以 “汉” 为例
- 拿到“汉”的Unicode表示
U+6C49
- 然后查看下图编码模板,得知6C49位于000800-00FFFF中间,所以我们得到模板
1110xxxx 10xxxxxx 10xxxxxx
,设为a
- 将
6C49
转化为二进制,得到0110 1100 0100 1001
,设为b
- 将 b 填充到 a 中的x位置,得到
11100110 10110001 10001001
,设为c
- 最后,将
c
转成16进制,得到E6 B1 89
,这个就是“汉”的UTF-8编码
写在最后
知道了什么格式的编码是什么格式之后,后面出现乱码的时候就可以比较容易的查到原因。我们要做的处理比较简单,就是前后台使用同一编码。就像语言交流,同一种语言才能共通。