常见字符编码

字符编码实现了字符集和编码值之间的映射关系,使得计算机可以识别并处理各种各样的字符。
由于历史原因,出现了多种字符编码标准,这些标准所使用的字符集和编码映射关系是大不相同的,有的标准效率高,但覆盖的字符(支持的抽象字符)太少,而有的支持大量字符,但由于编码格式的局限,效率较低。
各编码标准介绍:
ASCII
最早出现的编码标准是ASCII(谁叫计算机是发源自美国呢),由于拉丁字母很少,再加上一些常用的象形字符,凑起来也没超过128个,所以只使用了1个字节来表示,由于一个字节可以表示256种不同的状态,所以将最高位设置为0。老美可没考虑其他国家的文字。
GB系列(GB2312,GBK)
好了,ASCII只能表示128个字,可我们的汉字何止128个!所以我们需要另外一种字符编码标准来实现汉字的处理。
GB2312是一个简体中文字符集的中国国家标准,共收录6763个汉字,同时也收录了包括拉丁字母、希腊字母、日文平假名、俄语西里尔字母在内的682个全角(见附录全角与半角之区别)字符。GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名,古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK以及GB18030汉字字符集的出现。
GB2312的分区表示和字节结构
其分区表示方式是我们所熟悉的区位码,对收录的汉字进行了分区处理,共有94个区,每个区94个汉字,所以是94*94阵列,其中每一行是一个区。(这种表示方法的起源,ASCII中有94个象形符,估计是想用这些符号来表示汉字)
01-09区为特殊字符;
16-55区为一级汉字,按拼音排序;
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
字节结构涉及到实现方式,通常使用EUC存储方法,以便兼容ASCII,每个汉字及字符使用两个字节表示,
高位字节使用0xA1-0xF7(把01-87区的区号加上0xA0),低位字节使用0xA1-0xFE表示。
注意到这种表示方式的两个字节的最高位都是1。

GBK
国家标准扩展,扩展了GB2312中未使用的码点(code points)以表示更多的字符,最多占用两个字节。
编码格式:
使用1位或2位进行编码
字节为00-7F的表示与ASCII完全一致,即是有96个字符和32个控制码。
最高位为1的字节表示该字节是两字节(表示更多字符)中的高字节,高字节范围为81-FE,第二个字节(低字节)范围为40-FE,或者80-FE。
在GBK的编码规范里,GB2312只是其中一个子集。
reference:http://en.wikipedia.org/wiki/GBK

Unicode

Unicode(统一码、万国码、单一码、标准万国码)是一种计算机业界的标准,使得计算机可以呈现和处理世界上数十种文字。它基于通用字符集(Universal Character Set)标准来发展,包含了超过十万个字符。
Unicode的核心思想:将所有字符与类字符加以认定和编码,每一个元素对应一个码点(code point)。
所以有一个统一的unicode编码表,给出字符与unicode编码值的对应关系。
目前常用的是16位的unicode编码,构成了基本多文种平面(BMP,见http://zh.wikipedia.org/zh-cn/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E6%96%87%E7%A8%AE%E5%B9%B3%E9%9D%A2)。
BMP给出了各类字符集合的unicode编码范围。
对于BMP而言,标准的unicode要使用两字节来表示,这或许还不是问题,但如果unicode的范围不断扩充,有可能最新的unicode需要使用多达4字节来表示,这样表示一个ASCII字符时就浪费了3个字节。
所以在实际的信息传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对于unicode编码的实现方式有所不同,Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,即UTF)。
由此衍生出各种各样的UTF格式,UTF-8,UTF-16等。

UTF-8

一种针对Unicode的可变长度字符编码,也是一种前缀码。可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。
UTF-8使用1~4个字节为每个字符编码:
1.128个US-ASCII字符只需一个字节编码(Unicode范围为U+0000~U+007F);
2.带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节(Unicode范围U+0080~U+07FF);
3.其他多文种平面中的字符使用三个字节编码(例如中文,因为Unicode BMP字符编码值映射中中文字符占用了15位到16位,后面详细介绍);
4.其他极少使用的Unicode辅助平面的字符使用四字节编码。

UTF-8编码规范
(注:代码范围和标量值对应Unicode)
代码范围           标量值(scalar value)               UTF-8                       注释
十六进制             二进制                   二进制/十六进制
        
000000 - 00007F
128个代码     00000000 00000000 0zzzzzzz     0zzzzzzz(00-7F)            ASCII字符范围,字节由零开始
                          七个z                   七个z

000080 - 0007FF
1920个代码     00000000 00000yyy yyzzzzzz     110yyyyy(C2-DF) 10zzzzzz(80-BF) 第一个字节由110开始,接着的
                                                                                                                             字节由10开始
                     三个y;二个y;六个z              五个y;六个z

000800 - 00D7FF
00E000 - 00FFFF
61440个代码     00000000 xxxxyyyy yyzzzzzz     1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 第一个字节由1110开始,
                                                                                                                                    接着的字节由10开始
                  四个x;四个y;二个y;六个z            四个x;六个y;六个z
010000 - 10FFFF
1048576个代码     000wwwxx xxxxyyyy yyzzzzzz     11110www(F0-F4) 10xxxxxx 10yyyyyy 10zzzzzz
                                                                                                                         将由11110开始, 接着的字节由10开始


Unicode与UTF-8的转换示例:
希伯来语字母 aleph(?)的Unicode代码是 U+05D0,按照以下方法改成 UTF-8:

    * 它属于 U+0080到U+07FF区域,这个表说明它使用双字节,110yyyyy 10zzzzzz.
    * 十六进制 的 0x05D0换算成二进制就是 101-1101-0000.
    * 这11位数按顺序放入"y"部分和"z"部分:11010111 10010000.
    * 最后结果就是双字节,用十六进制写起来就是 0xD7 0x90,这就是这个字符aleph(?)的UTF-8编码。
reference:http://zh.wikipedia.org/zh-cn/UTF-8

附录
全角与半角之区别(来自中文维基百科)
全角,又称全形、全宽,是电脑字符的一种格式,字面意思是比普通字符(或半角字符)宽的字符。
传统上,英语或拉丁字母语言使用一字节的空间来存储,而汉字、日语等常使用两字节存储,在使用固定宽度文字的地方,为了使字体看起来整齐,英文字母、数字及其他符号,也由原来只占用一个字空间,改为一概占用两个字的空间来显示,并且使用两个字节来存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值