关于编码和存储

好记性不如烂笔头。之前看多很多关于编码的文章,当时应该记的挺清楚,过几天回头的就忘了。学习学习章亦春的抄代码的精神,多写写加深印象。

编码介绍

  • ASCII

    American Standard Code for Information Interchange 的缩写,中文意思为美国信息交换标准代码。看名字就知道是美国人设计的,用一个字节(8位)来表示。其中,0x00 到 0x1F 这32个表示特殊控制字符,比如响铃等。0x20 到 0x7F 这96个字符来表示大小写的26个英文字母和一些英文符号,总共128个字符。对于英文的存储,用 ASCII 码来表示完全可以了。

  • GB2312

    那么问题来了,想要表示中文怎么办?所以就有了GB2312,即国标2312,是我国国家标准局1980年颁布的,1981年5月1日开始实施的。GB2312 设计的时候是兼容 ASCII 的,用两个字节来表示,分为高位字节和低位字节,高位字节从 0xA1 到 0xF7,低位字节从 0xA0 到 0xFF,一共收录了6763个汉字,还收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。可以看到这两个字节都是大于 0x7F 的,如果有小于这个值那就会按照 ASCII 码的方式来表示了,这些字符也就是常说的半角字符。

  • GBK

    问题又来了,GB2312 竟然没有办法表示朱镕基的字,是不是要搞事情!所以又有了GBK编码,GBK编码不在要求低位字节大于 0x7F 了,只要高位字节大于就行。GBK编码于1995年发布,收录汉字21003个,加入了部分繁体字,采用双字节编码。GBK 向上兼容 GB2312。

  • GB18030

    有人说,不对啊,汉字加起来10万左右,两个字节怎么表示的完(最多可以表示65536个),还有少数民族文字怎么办?所以,GB18030编码方案于2000年发布第一版,收录汉字27533个;2005年发布第二版,收录汉字70000余个,以及多种少数民族文字。另外,GB18030采用单字节、双字节、四字节分段编码。

  • UNICODE

    中文的问题终于解决了,几乎所有的简体汉字、繁体字以及少数民族语言都可以用 GB18030 来表示了。但是如果世界各地的人想相互交流该怎么办,于是国际化标准组织重新提出新的一套编码方式,可以用来表示世界上所有字符。这个编码方式采取两个字节来表示,即使是 ASCII 编码 unicode 采取原编码不变,高位全是 0 的方式。这使得 unicode 来表示英文字符的时候要浪费一倍的空间!

  • UTF-8

    一段时间以来 unicode 的编码方式很难推广,直到互联网出现,一种面向传输的 UTF (UCS Tranfer Format) 标准出现了。UTF-8 就是每次传输8个位数据,是互联网应用最广泛的一种 unicode 的实现方式,即可以表示世界上所有的符号,也可以一定程度的节省空间。 UTF-8 采用变长的编码方式,在字符在 ASCII 范围时,就采用一个字节表示,等同于 ASCII 的编码方式;但是不同于 unicode 编码,UTF-8 在表示中文的时候需要 3 个字节, 事实证明在大多数场合使用 UTF-8 比 unicode 要节省空间。 UTF-8 的编码如果最高位是 0 那就等同于 ASCII 编码,如果高位出现连续的 n 个 1,那么后面的 n - 1 个字节最高两位都是 10。

编程语言中编码的应用

  • php 截取指定长度的中英文字符串

    1
    2
    3
    $str = 'AB一二';
    $substr = mb_substr($str, 0, 3, 'utf-8'); //截取前三位
    echo $substr; //输出 AB一
显示 Gitment 评论