在计算机中,所有的数据在存储和运算时,都要使用二进制数表示。编码是指具体使用哪些二进制数字表示哪个符号。
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。
URL 编码总是大写。
Base64 编码
对二进制数据进行编码,表示成文本格式。
Base64 编码可以把任意长度的二进制数据变为纯文本,且只包含A~Z、a~z、0~9、+、/、=这些字符。它的原理是把 3 字节的二进制数据按 6bit 一组,用 4 个 int 整数表示,然后查表,把 int 整数用索引对应到字符,得到编码后的字符串。