在计算机中,所有的数据在存储和运算时,都要使用二进制数表示。编码是指具体使用哪些二进制数字表示哪个符号。

ASCII 码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)

使用标准的单字节字符编码方案,规定了 128 个字符的编码。(最前面的一位统一规定为 0,只使用一个字节后面的七位)。

ANSI 编码

对于中文及相关字符,128 个字符显然不够,因此在 ASCII 编码方案的基础上,中国大陆地区设计了 GB系列编码;同样,世界各个国家和地区的文字都有对应的编码。这些编码兼容 ASCII,但互相之间并不兼容,微软将其统称为 ANSI编码。

在微软 Windows 系统中,ANSI 编码一般代表系统默认的编码方式,并不是确定的某一种编码方式:

  • 在简体中文操作系统中 ANSI编码 默认指的是 GB系列编码(GB2312、GBK、GB18030)
  • 在日文操作系统中 ANSI编码 默认指的是 Shift JIS编码

GB 系列编码

GB2312

GB2312 规定一个小于 127 的字符的意义与原来相同,而两个大于 127 字符连在一起时,就表示一个汉字,前面的一个字节(高字节)从 0xA1 到 0xF7,后面一个字节(低字节)从 0xA1 到 0xFE,这样就可以组合出大约 7000 多个简体汉字。

GB2312 是对 ASCII 的中文扩展。兼容 ASCII。

GBK

不再要求低字节一定是127号之后的内码,只要第一个字节是大于 127 就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。

GBK 包括了GB2312 的所有内容,同时又增加了近 20000 个新的汉字(包括繁体字)和符号。

GB18030

GB18030 采用多字节编码,每个字符可以由 1 个、2 个或 4 个字节组成。

Unicode

Universal Multiple-Octet Coded Character Set, 简称 UCS,也称为 Unicode

Unicode 是一个符号集,将世界上所有的符号都纳入其中,每一个符号都有独一无二的编码,规定使用 2 个字节来表示一个字符。

Unicode 没有考虑与任何一种现有的编码方案保持兼容,导致 GBK 与 Unicode 在汉字的内码编排上完全不一样,没有一种简单的算数方法可以将文本内容从 Unicode 编码和另一种编码进行转换,必须通过查表来进行。

Unicode 只规定了符号的二进制代码,并没有规定这个二进制代码如何存储。

UTF-8

为了解决 Unicode 在网络上传输的问题,出现了众多 UTF (UCS Transfer Fromat) 标准,如 UTF-8 表示每次传输 8 位的数据,UTF-16 表示每次传输 16 位的数据。

UTF-8 是一种变长的编码方式,可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。

对于汉字,UTF-8 编码需要 3 个字节。

URL 编码

URL 编码是浏览器发送数据给服务器时使用的编码,通常附加在 URL 的参数部分,例如:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87

处于兼容性考虑,很多服务器只识别 ASCII 字符。如果 URL 中包括中文、日文等非 ASCII 字符怎么办?

URL 编码有一套规则:

  • 如果字符是A-Z, a-z, 0-9, -, _, ., *,则保持不变

  • 如果是其他字符,先转换为 UTF-8 编码,然后对每个字节以 %XX 表示

如,字符UTF-8 编码是 0xe4b8ad,对应的 URL 编码是 %E4%B8%AD

NOTE:

URL 编码总是大写。

Base64 编码

对二进制数据进行编码,表示成文本格式。

Base64 编码可以把任意长度的二进制数据变为纯文本,且只包含A~Z、a~z、0~9、+、/、=这些字符。它的原理是把 3 字节的二进制数据按 6bit 一组,用 4int 整数表示,然后查表,把 int 整数用索引对应到字符,得到编码后的字符串。

相关阅读