转载前言:
现在国内流行用诙谐的语言写技术文章,看了好多,确实容易看进去点,特别是“编码”、“字符集”这类纯枯燥的东西。
但是有些说的确实是云里雾里的。
国内的
===========================
作者: Marius Bancila
字符集简史 在所有 字符集中,最知名的可能要数被称为ASCII的7位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个 字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、 制表符等4个)以及 控制字符(退格、响铃等)组成。 但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。因此,创建出了一些包括255个字符的由 ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是 ISO 8859-1Latin 1,也简称为ISO Latin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。 欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语(或pictograms)字母表就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个 字节就可以编码地球上几乎所有地区的文字。因此,创建了 UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国象形文字)。但是,UNICODE并没有提供对诸如Braille, Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom, Akkadian, Aramaic, Babylonian Cuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老文字。 事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即 UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。本文讨论UTF-8字符集的基础。编辑本段UTF8字符集
如果UNICODE 字符由2个 字节表示,则编码成UTF-8很可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。 UTF-8转换表表示如下:UNICODE | bit数 | UTF-8 | byte数 | 备注 |
0000 0000 ~ 0000 007F | 0~7 | 0XXX XXXX | 1 | |
0000 0080 ~ 0000 07FF | 8~11 | 110X XXXX 10XX XXXX | 2 | |
0000 0800 ~ 0000 FFFF | 12~16 | 1110 XXXX 10XX XXXX 10XX XXXX | 3 | 基本定义范围:0~FFFF |
0001 0000 ~ 001F FFFF | 17~21 | 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX | 4 | Unicode6.1定义范围:0~10 FFFF |
0020 0000 ~ 03FF FFFF | 22~26 | 1111 10XX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 5 | |
0400 0000 ~ 7FFF FFFF | 27~31 | 1111 110X 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 6 | |
Unicode 16进制 | Unicode 2进制 | bit数 | UTF-8 2进制 | UTF-8 16进制 |
CA | 1100 1010 | 8 | 1100 0011 1000 1010 | C3 8A |
F0 3F | 1111 0000 0011 1111 | 16 | 1110 1111 1000 0000 1011 1111 | EF 80 BF |