
GB2312:知足国人需求的字符集
后来,计算机开端普及到了中国,但面对的一个问题就是字符,汉字博大年夜精深,常用汉字有3500个,已经大年夜大年夜超出了 ASCII 字符集所能表示的字符范围了,即使是 EASCII 也显得杯水车薪,1981 年国度标准化治理委员会定了一套字符集叫 GB2312,每个汉字符号由两个字节构成,理论上它可以表示65536个字符,不过它只收录了7445个字符,6763个汉字和682个其他字符,同时它可以或许兼容 ASCII,ASCII 中定义的字符只占用一个字节的空间。
GB2312 所收录的汉字已经覆盖中国大年夜陆99.75%的应用频率,然则对一些罕有的字和繁体字还有很若干瘪平易近族应用的字符都没法处理,于是后来就在 GB2312 的基本上创建了一种叫 GBK 的字符编码,GBK 不仅收录了27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等重要的少数平易近族文字。GBK 是应用了 GB2312 中未被应用的编码空间长进行扩充,所以它能完全兼容 GB2312和 ASCII。而 GB 18030 是现时最新的字符集,兼容 GB 2312-1980 和 GBK, 共收录汉字70244个,采取多字节编码,每个字符可以有1、2、4个字节构成,某种意义上它能容纳161 万个字符,包含繁体汉字以及日韩汉字,单字节与ASCII兼容,双字节与GBK标准兼容。
Unicode :同一江湖的字符集
以上是对字符集汗青的一个扼要回想,如今重点来说说Unicode,Unicode 是一个囊括了世界上所有字符的字符集,个中每一个字符都对应有独一的编码值(code point),留意了!它不是字符编码,仅仅是字符集罢了,Unicode 字符若何进行编码,可所以 UTF-8、UTF-16、甚至用 GBK 来编码。例如:
- >>> a = u"好"
- >>> a
- u'\u597d'
- >>> b = a.encode("utf-8")
- >>> b
- '\xe5\xa5\xbd'
- >>>
- >>> b = a.encode("gbk")
- >>> b
- '\xba\xc3'
Unicode 本身并没针砭定一个字符毕竟是用一个照样三个或者四个字节表示。Unicode 只规定了每个字符对应到独一的代码值(code point),代码值 大年夜 0000 ~ 10FFFF 共 1114112 个值 ,真正存储的时刻须要若干个字节是由具体的编码格局决定的。比如:字符 「A」用 UTF-8 的格局编率攀来存储就只占用1个字节,用 UTF-16 就占用2个字节,而用 UTF-32 存储就占用4个字节。
UTF-8:Unicode编码
UCS-2 应用两个定长的字节来表示一个字符,UTF-16 也是应用两个字节,不过 UTF-16 是变长的(网上很多缺点的说法说 UTF-16是定长的),碰到两个字节没法表示时,会用4个字节来表示,是以 UTF-16 可以看作是在 UCS-2 的基本上扩大而来的。而 UTF-32 与 USC-4 是完全等价的,应用4个字节表示,显然,这种方法浪费的空间比较多。
UTF-8 的优势是:它以单字节为单位用 1~4 个字节来表示一个字符,大年夜首字节就可以断定一个字符的UTF-8编码有几个字节。如不雅首字节以0开首,肯定是单字节编码,如不雅以110开首,肯定是双字节编码,如不雅是1110开首,肯定是三字节编码,以词攀类推。除了单字节外,多字节UTF-8码的后续字节均以10开首。
1~4 字节的 UTF-8 编码看起来是如许的:
引用
- 0xxxxxxx
- 110xxxxx 10xxxxxx
- 1110xxxx 10xxxxxx 10xxxxxx
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- 单字节可编码的 Unicode 范围:\u0000~\u007F(0~127)
- 双字节可编码的 Unicode 范围:\u0080~\u07FF(128~2047)
- 三字节可编码的 Unicode 范围:\u0800~\uFFFF(2048~65535)
- 四字节可编码的 Unicode 范围:\u10000~\u1FFFFF(65536~2097151)
UTF-8 兼容了 ASCII,在数据传输和存储过程中节俭了空间,其二是UTF-8 不须要推敲大年夜小端问题。这两点都是 UTF-16 的劣势。不过对于中文字符,用 UTF-8 就要用3个字节,而 UTF-16 只需2个字节。而UTF-16 的长处是在计举动当作符串长度,履行索引操作时速度会很快。Java 内部应用 UTF-16 编码筹划。而 Python3 应用 UTF-8。UTF-8 编码在互联网范畴应用加倍广泛。
来看一张图,下图是Windows平台保存文件时可选择的字符编率攀类型,你可以指定体系以什么样的编码格局来存储文件,ANSI 是 ISO 8859-1的超集,之所以在 Windows下有 Unicode 编码如许一种说法,其实是 Windows 的一种缺点表示办法,或许是因为汗青原因一向沿用至今,其实它真正表示的是 UTF-16 编码,更具体一点是 UTF-16小端,什么是大年夜端和小端呢?
推荐阅读
捷报道,美国华盛顿大年夜学的研究人员正在研究所谓的“智能织物”,他们的重点放在磁化纺织品上。这种纺织品可以存储能被磁力仪攫取的少量数据,包含存储在大年夜多半智妙手机内部的数据。这>>>详细阅读
本文标题:一筹莫展?来看看字符编码的前世今生吧
地址:http://www.17bianji.com/lsqh/38408.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示