字符编码

开发过程当中,有时会遇到乱码的状况,而后不知道为何,对编码没有了解,遇到问题的时候也就一脸懵逼了,这篇文章对编码作了一个汇总。编码

一开始

写代码的时候,编码出问题的时候,就知道把编码设置为UTF-8,为啥呢?不知道。了解完编码以后,才不会只熟悉编码的拼写。code

字符

说编码以前,咱们要先来了解一下字符cdn

什么是字符?blog

字符:字符很简单,其实就是一个表示,好比:中文字符、英文字符...开发

而后,什么是字符集it

字符集:字面上理解,就是具体共同特征的字符的集合io

编码

说完字符以后,咱们来看一下什么是编码模板

编码 = 占用存储 + 编码表class

首先,看一下什么占用存储?即规定一个字符用多少个字节来显示,为何呢?由于计算机只能处理0|1数据,因此咱们要规定占用存储。后台

占用存储:规定一个字符用多少个字节来显示

而后,来看一下什么是编码表,编码表这个就容易了,就是规定哪一个字符对应哪一个编码。

编码表:规定字符集种每一个字符的对应关系

编码说完了,咱们来看一下编码格式。

ASCII(美国标准信息交换代码)

提及编码,第一个确定要说到ASCII,这个应该是咱们接触的第一个编码格式。

  • 一个字节(7/8位)
  • 定义128个字符(显示字符95个,非显示字符33个)

因为ASCII只定义了英文字符,中文等其余复杂的字符不能表现,因此有了ASCII的扩展,如GB23十二、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

咱们以 “汉” 为例

  1. 拿到“汉”的Unicode表示 U+6C49
  2. 而后查看下图编码模板,得知6C49位于000800-00FFFF中间,因此咱们获得模板 1110xxxx 10xxxxxx 10xxxxxx,设为 a
  3. 6C49 转化为二进制,获得 0110 1100 0100 1001 ,设为 b
  4. 将 b 填充到 a 中的x位置,获得 11100110 10110001 10001001 ,设为 c
  5. 最后,将 c 转成16进制,获得 E6 B1 89 ,这个就是“汉”的UTF-8编码

写在最后

知道了什么格式的编码是什么格式以后,后面出现乱码的时候就能够比较容易的查到缘由。咱们要作的处理比较简单,就是先后台使用同一编码。就像语言交流,同一种语言才能共通。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息