旁门左道

没有用的技能

字符编码知识

要开始进行name帐号的测试了,在用例中看到了不同编码格式的用例。之前对字符编码的认识也仅仅停留在ASCII与GB2312-80的层次,对unicode还是比较陌生的。所以就花时间研究了一下字符编码的知识。

1.    常用字符集分类
1.1 简介
·        ASCII及其扩展字符集
作用:表语英语及西欧语言。
位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。
范围:ASCII007F,扩展从00FF

·        ISO-8859-1字符集
作用:扩展ASCII,表示西欧、希腊语等
位数:8位,
范围:从00FF,兼容ASCII字符集。

·        GB2312字符集
作用:国家简体中文字符集,兼容ASCII
位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。
范围:高字节从A1F7, 低字节从A1FE。将高字节和低字节分别加上0XA0即可得到编码。

·        BIG5字符集
作用:统一繁体字编码。
位数:使用2个字节表示,表示13053个汉字。
范围:高字节从A1F9,低字节从407EA1FE

·        GBK字符集
作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312
位数:使用2个字节表示,可表示21886个字符。
范围:高字节从81FE,低字节从40FE

·        GB18030字符集
作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK
位数:它采用变字节表示(1 ASCII24字节)。可表示27484个文字。
范围:1字节从007F; 2字节高字节从81FE,低字节从407E80FE4字节第一三字节从81FE,第二四字节从3039

·        UCS字符集
作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2UNICODE兼容。
位数:它有UCS-2UCS-4两种格式,分别是2字节和4字节。
范围:目前,UCS-4只是在UCS-2前面加了0x0000

·        UNICODE字符集
作用:为世界650种语言进行统一编码,兼容ISO-8859-1
位数:UNICODE字符集有多个编码方式,分别是UTF-8UTF-16UTF-32
UTF-8采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下:
如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。

UTF-16采用2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从 0x00000x007FASCII字符,从0x00800x00FFISO-8859-1ASCII的扩展。希腊字母表使用从0x03700x03FF 的代码,斯拉夫语使用从0x04000x04FF的代码,美国使用从0x05300x058F的代码,希伯来语使用从0x05900x05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x30000x9FFF的代码;
注意:unicode只是一个编码规范,具体的编码实现有utf-8,utf-16,utf-32.

优缺点:
·        UTF-8UTF-16UTF-32都可以表示有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。
·        使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。
·        对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。
·        Windows NT内核是UnicodeUTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。
·        采用UTF-16UTF-32会有Big EndianLittle Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。
·        UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。

简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是不兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的unicode值与gbk就是不一样的,假设unicode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对unicode来组织的,如果GBK要转UTF-8必须先转unicode码,再转utf-8就OK了.字符集的转换比较麻烦,比如繁简转换就是比较复杂的,而unicocde与utf-8的转换就比较容易。unicode字符的显示在windows系统上是借助于代码页完成的。

2. 字节序
首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。不同的处理器可能不一样。所以,传输时需要告诉处理器当时的编码字节序。对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。例如,0X03AB, 
Big Endian字节序是
0000: 0 3
0001: AB
Little Endian字节序是
0000: AB
0001: 0 3
3.不同编码格式的存储

windows自带的记事本可以存储四种格式的编码分别是ANSI、unicode(little endian)、unicode big endian、utf-8。其中ANSI是以当前的字符集编码存储的,简体的系统就是GBK,繁体的系统就是Big5。

如果我们在记事本中输入一个“國”字,分別以四种编码格式保存,然后再用二进制工具打开可以看到如下结果:

87 F8       ANSI   (因为我用的是简体中文,所以就是GBK编码)

FF FE 0B 57   unicode

FE FF 57 0B    unicode big endian  

EF BB BF E5 9C 8B  utf-8 前三个字节是标志字节,说明此文件是utf-8编码的

國字的unicode编码是u+0B57,FF FE是字节序标志,如果是FE FF就是big endian,如果是FF FE就是little endian。

以ANSI保存的“國”字在繁体系统下面是不能正常显示的,虽然看上去是繁体的。以后三种格式保存的“國”在繁體系統下可以正常显示。

阅读更多
个人分类: Other
想对作者说点什么? 我来说一句

关于 字符编码的 转换 知识

2014年10月04日 510KB 下载

字符和字符编码

2011年11月20日 553KB 下载

字符 编码 概述

2009年07月24日 41KB 下载

HTML特殊字符编码

2008年11月11日 114KB 下载

java字符编码监听器

2009年09月26日 2KB 下载

没有更多推荐了,返回首页

不良信息举报

字符编码知识

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭