最近工作需要,做了很多unicode、gbk、宽字节、多字节的转换,然后自己就混乱了,所以就搜索的一些资料,简单汇总一下,防止下次的混乱。
ASCII编码
美国人制定的一套字符集,描述英语中的字符和8位二进制数(1字节)的对应关系,这被称为 ASCII 码。ASCII码共定义了128个字符,使用了8位二进制数中的7位,最高位统一规定为0。
unicode编码
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。 它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求.
UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。Unicode可以使用的编码有三种,分别是UTF-8,UTF-16,UTF-32。
utf-8
utf-8的编码规则很简单:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。具体的转换表如下:
xxx 就用来存储 Unicode 中的字符编号
utf-16
utf-16大部分以固定长度的字节 (2字节) 储存,也有四个字节储存,但UTF-16却无法兼容于ASCII编码
字节 | utf-16 |
---|---|
2 | xxxxxxxx xxxxxxxx |
4 | 110110xx xxxxxxxx 110111xx xxxxxxxx |
utf-32
utf-32:所有的字符都以4个字节长度来储存,也无法兼容ASCII编码
GBK
gbk(多字节字符编码):字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。而英文字符最高位是0。Gbk编码容纳了所有的中国字符。
宽字符和窄字符(多字节字符)
首先要注意:宽窄字符与UTF16,UTF8不是对应的关系
有的编码方式采用 1~n 个字节存储,是变长的,例如 UTF-8、GB2312、GBK 等;如果一个字符使用了这种编码方式,我们就将它称为多字节字符,或者窄字符
有的编码方式是固定长度的,不管字符编号大小,始终采用 n 个字节存储,例如 UTF-32、UTF-16 等;如果一个字符使用了这种编码方式,我们就将它称为宽字符。