大宝自习室

道路就在脚下

字符编码小结

| 评论

简单介绍

众所周知,计算机是只能处理0、1数据的。但是我们经常使用的电脑中所出现的字符、汉字、控制符等等在计算机内是怎么处理和存储的呢?这个就涉及到计算机内部字符的编码问题,怎么将字符、汉字等编码成计算机可以处理和存储的0、1格式。在计算机发明之初,科学家便面临着这个问题。当时由于各个厂商的编码都不太一致,导致了市面上的计算机编码比较混乱,直至后来随着科学技术的发展,标准的制定,编码也越来越规范和通用。下面将介绍几种常用的编码集及编码方式。

ASCII

ASCII(American Standard Code for Information Interchange)即美国信息交换标准代码,是基于拉丁字母的一套计算机编码系统。ASCII定义了128个字符,在一个字节中占有7bit位,在一个字节中恰好占有后7位,范围为0x00~0x7F,最高位为0. ASCII码表图

ASCII字符集共2^(7)=128个字符 = 33个控制字符 + 95个可见字符。

扩展ASCII
后来,由于128个字符根本不足以来使用,于是又有了扩充的的ACSII编码。这样的编码就是将最高位利用,8bit充分利用,新的取值范围为0x00~0xFF。 其实这个是没多大意义的。在法国可能扩展针对法语的扩展;在阿拉伯国家又有自己语言的扩展。显然这两种扩展时不能通用的。另外在中国,128个扩展相对于汉字的数量来说完全不在同一个数量级上,这种扩展对汉字来讲意义不大。

Unicode,GBK和BIG5

简单来说,Unicode,GBK和BIG5都是字符编码的值。而这3个字符编码集是互不兼容的。也就是说,同一个汉字在Unicode中对应的数字与在GBK中对应的数字是不相同的。 BIG5是针对繁体中文的字符编码集,主要流行于繁体中文使用的台湾、香港和澳门等地区。 例如,一个汉字是UTF-8编码的,要转化成GBK形式,怎么做呢? 首先,将UTF-8的汉字转化成Unicode码,然后将Unicode码转化成GBK码。

Unicode

Unicode出现的目的就是为世界上每一个字符提供唯一的一个数字与之对应,无论处在什么平台、程序和语言环境下,它都是唯一的。它的好处就在于我们无论身处世界的各个角落,只要遵循Unicode标准的字符,换在其他平台上或者程序上它所表示的字符都是固定的。不会因为语言和程序环境的变化导致程序显示乱码。以前经常遇到的邮件乱码便是由于发件人的编码同收件人的编码不一致,导致收件人发到的邮件显示乱码。
Unicode编码有其官网(http://www.unicode.org/),UnicodeUnicode用数字0-0x10FFFF来映射这些字符,最多可以容纳 4112个字符,或者说有1114112个码位。在官网上有提供字符与数字对应的文档,在里面可以查到每个字符对应的数字,例如字符'你'对应数字U+4F60,'东'对应U+4E1C数字等。 Unicode面临的问题: 字符所对应的数字从0~0x10FFFF,它们对应的8bit字节长度从1~3个。U+0041表示英语的大写字母A,只需一个字节就可以存储,汉字字符'你'对应U+4F60就需要2个字节,有些字符可能需要3个字节来存储。对不同的字符,存储它需要不同长度的空间存储。对计算机来说不知道那些字节是单个字节对应一个字符,那些字节是双字节对应一个字符。 如果都统一用3个字节存储的话,对都是英文的文档,其存储长度是ASCII码存储长度的3倍,其中大部分空间都浪费了。显然这种方法也不太合适。所以对Unicode同一字符的数字,但不同软件和设备按照不同的编码规则将其编码成不同的0、1存储格式,这就导致Unicode也会出现乱码。

UTF系列编码

UTF编码方式包括UTF-8、UTF-16和UTF-32,我们常用的编码方式UTF-8。从Unicode的介绍可以知道,Unicode只定义了每个字符所对应的数字,即它只定义了字符集,并没有定义每个字符对应的数字是如何编码成2进制字节处理和存储的。这就导致了编码方式不一致而产生的编码解码问题。 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)百度百科. UTF-16
将Unicode字符集的抽象码位映射为16位长的整数的序列,用于数据存储或者传递。对Unicode字符码,一般需要1~2个16位的码元来标示,是一个变长的编码规则。 UTF-32
UTF-32 (或 UCS-4)是对每一个Unicode码位使用恰好32位元。因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的编码规则。 这3中UTF编码规则中,UTF-8是最常用的。下面将简单介绍一下UTF-8编码抽象码位的规则:

Unicode/UCS-4 bit数 UTF-8 byte数 备注
0000 ~ 007F 0~7 0XXX XXXX 1
0080 ~ 07FF 8~11 110XXXXX 10XXXXXX 2
0800 ~ FFFF 12~16 1110XXXX 10XXXXXX 10XXXXXX 3 基本定义范围:0~FFFF
1 0000 ~ 1F FFFF 17~21 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX 4 Unicode6.1定义范围:0~10 FFFF

从上表知道,对ASCII字符UTF-8编码只需要1个字节,对其他的需要2个或2个以上的字节表示。Unicode转换为UTF-8时,可以将Unicode二进制从低位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下示例所示的格式,前面按格式填补,不足8位用0填补。转换为UTF-8需要的字节数可以根据Unicode 二进制的位数除以6来计算。

Unicode 16进制 Unicode2进制 bit数 UTF-8二进制 UTF-8十六进制
0xCD '11001101' 8 '11001101 10001101' 0xCD8D
0xF03F '11110000 00111111' 16 '11101111 10000000 10111111' 3

UTF-8缺点:

  1. 显然我们无法从输入的UTF-8文本的字节数来计算出Unicode字符数字(UTF-8变长)。
  2. 对非ASCII的字符,UTF-8都需要2个或2个以上的字节来表示。无疑它增加了只用Unicode数字表示所需的字节长度。
  3. UTF-8编码的字节无法直接在网络上传输。由于历史的原因,网络上的设备会过滤掉传递的字符串第8bit位,而UTF-8中大量有1 *类的字节。在网络上这些字节的传递信息都会丢失掉。

GBK编码系列

GB2312
《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。基本集共收入汉字6763个和非汉字图形字符682个。GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。GB 2312基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。

GB18030
国家标准GB18030是我国继GB2312之后最重要的汉字编码标准。GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。简单来说GB2312是GB18030的子集,并且GB18030是兼容GB2312的。 至于GBK系列汉字编码规则本篇博客省略。博客主要内容来源于网络。

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
若无特别注明,本站内容均属原创,转载请注明作者(hbaojun)和出处 大宝自习室 ,请勿用于任何商业用途。
属于 编码 分类 被贴了 字符, 编码 标签

« PKCS#7结构分析之数字信封 SSL与TLS协议 »

评论