ASCII码
在一开始计算机中,1 字节对应 8 位二进制数,而每位二进制数有 0、1 两种状态,因此 1 字节可以组合出 256 种状态。如果这 256 中状态每一个都对应一个符号,就能通过 1 字节的数据表示 256 个字符。美国人于是就制定了一套编码(其实就是个字典),描述英语中的字符和这 8 位二进制数的对应关系,这被称为 ASCII 码。
ASCII 码一共定义了 128 个字符,例如大写的字母 A 是 65(这是十进制数,对应二进制是0100 0001)。这 128 个字符只使用了 8 位二进制数中的后面 7 位,最前面的一位统一规定为 0。
Unicode
显然128位的ASCII并不能表示世界上所有语言的字符,人们意识到应该提出一种标准方案来展示所有的字符,出于这个目的,Unicode诞生了。Unicode的前128位表示的字符和ASCII相同,这就向前兼容了旧的ASCII编码的文件。
Unicode 当然是一本很厚的字典,记录着世界上所有字符对应的一个数字,但是它仅仅只是一个字符集,规定了包含哪些字符以及对应的二进制代码,至于这个二进制代码如何存储则没有任何规定,所以就有了比较流行了的几种Unicode编码实现格式。
Unicode编码实现
UTF:Unicode Transformation Format,即Unicode字符集转换格式。Unicode有3种实现方式即:UTF-8、 UTF-16、UTF-32。
-
UTF-8:
以8比特位为一个单位,一个字符的表示最少一个单位即一个字节,最大4个单位即4个字节。 -
UTF-16:
以16比特位为一个单位,一个字符的表示要么用一个单位即2个字节,要么用2个单位即4个字节。 -
UTF-32
以32个比特位为一个单位,即4个字节。所有的unicode编码都可以直接表示了,而且码位远远用不完。实现很简单,但是由于大部分字符用两个字节足够,4个字节太浪费空间了,所以很少用。
以UTF-8为例:
Unicode 十六进制码点范围 | UTF-8 二进制 |
---|---|
0000 0000 - 0000 007F | 0xxxxxxx |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
比如“汉”字,其Unicode编码为0x6c49(110 1100 0100 1001),通过上面的对照表可以发现,0x0000 6c49 位于第三行的范围,那么得出其格式为 1110xxxx 10xxxxxx 10xxxxxx。接着,从“汉”的二进制数最后一位开始,从后向前依次填充对应格式中的 x,多出的 x 用 0 补上(001001填充到10xxxxxx)。这样,就得到了“汉”的UTF-8 编码为 11100110 10110001 10001001,转换成十六进制就是 0xE6 0xB1 0x89。
解码的过程也十分简单:如果一个字节的第一位是 0 ,则说明这个字节对应一个字符;如果一个字节的第一位1,那么连续有多少个 1,就表示该字符占用多少个字节。
URL编码
URL 只能使用 ASCII 字符集(128个字符)来通过因特网进行发送。也就是说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,这意味着如果URL存在汉字,就必须编码后使用。
规则:
其实就是取特殊字符的十六进制UTF-8编码字符,然后在其前面放置转义字符("%")。比如“汉”字,其UTF-8 编码为 11100110 10110001 10001001,十六进制就是 0xE6 0xB1 0x89,URL编码就为:%e6 %b1 %89。
网友评论