小点集

作者: 言霏 | 来源:发表于2020-04-21 12:25 被阅读0次

    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-8UTF-16UTF-32

    1. UTF-8:
      以8比特位为一个单位,一个字符的表示最少一个单位即一个字节,最大4个单位即4个字节。
    2. UTF-16:
      以16比特位为一个单位,一个字符的表示要么用一个单位即2个字节,要么用2个单位即4个字节。
    3. 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

    相关文章

      网友评论

          本文标题:小点集

          本文链接:https://www.haomeiwen.com/subject/xpbyihtx.html