字符编码

本文深入讲解了字符编码的发展历程,从ASCII到Unicode,再到各种编码格式如UTF-8、GBK等,帮助读者理解编码原理及解决乱码问题。

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

一开始

写代码的时候,编码出问题的时候,就知道把编码设置为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

我们以 “汉” 为例

  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编码

写在最后

知道了什么格式的编码是什么格式之后,后面出现乱码的时候就可以比较容易的查到原因。我们要做的处理比较简单,就是前后台使用同一编码。就像语言交流,同一种语言才能共通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值