我的VB作品|初学指南|编程技巧|源码下载|工具控件|VBA应用|Blog|【电信线路】|【网通线路】
   位置: VB知识库 >> 编程技巧 >> 字符编码 >> 正文
最新调查
    你是怎样知道VB知识库的?
通过搜索引擎
即时通讯工具
朋友介绍
友情链接
其它

  

频道统计
Unicode,UTF-8等编码的介绍[VB知识库-Visual Basic Knowledge base]
Unicode,UTF-8等编码的介绍[VB知识库-Visual Basic Knowledge base]
 更新时间:2008-4-29 0:14:55  点击数:14
【字体: 字体颜色

UCS(Unversal Character Set通用字符集)是31位的,也就是编码空间从U+00000000到U+7FFFFFFF,理论上最多可表达2147483648个字符,几十年内已经足够了。UCS的编码叫作Unicode(统一码),是由Apple和Xerox两家公司最初搞,后来Microsoft、IBM陆续加入,导致成立了一个Unicode.org。Unicode已经是ISO了,标准号是10646,官方站点为
http://www.unicode.org
http://www.iso10646.com
http://www.iso10646.org
  UCS的31位最高7位为128个Group(组),再往后由高到低的每个字节分别为256个Plane(平面),256个Row(行)和256个Cell(字)。其中,第0组第0平面的256行x256字组成的平面叫作BMP(Basic Multilingual Plane基本多语言平面),现在还在流通使用的多数文字符号就在这个平面内,包括21003个汉字。UCS分为UCS-2,UCS-4,UCS-2只是BMP部分,而UCS-4则包括全部UCS编码点。UCS-2、UCS-4只是Unicode的内部逻辑表示,而其具体的编码有多种变形形式Unicode/UCS Transformation Format(缩写为UTF,意为Unicode/UCS变换格式),最常见的有三种:UTF-8、UTF-16、UTF-32,8、16、32指的是编码单位的位数。
  UTF-32最简单,就是用4个字节32位来表示UCS-4,最高位置0,固定不用。
  UTF-16我们最常用,它主要用于表示BMP部分的UCS-2。Unicode一词,狭义来讲,也可以专指UTF-16,而且再狭义来讲,在Windows系统运行的主流的Intel机上,Unicode指Unicode Little Endian,这个词语在文章末有解释。因为现在BMP以外的字符很少用到,所以用固定的4字节表示字串和用于传输都非常方便,比32位要省空间,又比UTF-8变长便于处理。但是对于传统的C等处理机制,由于第0行的字符高字节都将为00,会有不少的麻烦。UTF-16也可以用两个相邻的16位字表达从U+00010000~U+0010FFFF这超出BMP的20位编码点,叫作代用对。代用对中,高字取值范围为0XD800~0XDBFF,而低字为0XDC00~0XDFFF。用高字的值减去0XD800左移10位再加上低字的值减去0XDC00,结果再加上0X10000得到对应于UCS-4中的码值。这意味着,在0XD800~0XDFFF在BMP中是专用区,只用来映射U+00010000~U+0010FFFF的编码点,本身不表示字符。可以看出,它的优点是,如果发现哪个字节值范围在代用对内,就可以知道相邻两字表示一个字符编码,而哪个是前字哪个是后字由于代用对中高低字取值范围不同可以区分,不用像GB字库那样一定要从字串最左往右依次进行才会正确。
  UTF-8经常被用于文本文件和网络传输,因为不少这类场合还停留在ANSI时代,需要向纯ASCII兼容。UTF-8是变长的,长度在1至6字节。在内容只是ASCII的0X00~0X7F时,UTF-8与ASCII或各种ANSI编码(如GB,JISKSC,ISO-8859-1)的ASCII部分完全兼容,也是用1字节的低7位表示。这就保证文本编辑器打开的UTF-8格式文档中,即使扩展字符无法显示,但ASCII部分肯定得以顺利解读。这点对于还需要假定是各种ANSI编码的场合非常有用,比如HTML,前面的纯ASCII部分一直到META标记,然后可以确定随后的编码,而此时UTF-16则不能正常工作。UTF-8采用如下所示的二进制方式来表示31位UCS-4,X表示有效位:
1字节 0XXXXXXX
2字节 110XXXXX 10XXXXXX
3字节 1110XXXX 10XXXXXX 10XXXXXX
4字节 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
5字节 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
6字节 1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
  从上可以看得出,如果处在第一字节的引导字节最高位为0,则是一字节。否则看前导1的个数,来确定是几个字节长。前导1与有效位之间有0相隔,也可以通过首字节的值范围来确定字节数。
1字节 0  ~127
2字节 192~223
3字节 224~239
4字节 240~247
5字节 248~251
6字节 252~253
  随后的字节每个都以10为前导位,取值范围则在128~191之间。可以立即得知一个字节是否为后续字节,因为引导字节的引导位不是00、01就是11,不会是10。如果更少字节的UTF-8可以表示一个UCS-4的字符,就不应该用更多的字节来表示,比如像0X41"A",是不会去用2~6字节来表示的,只会用1字节。编码范围与UTF-8字节数关系如下:
1字节 0 ~ 7位 U+00000000~U+0000007F
2字节 8 ~11位 U+00000080~U+000007FF
3字节 12~16位 U+00000800~U+0000FFFF
4字节 17~21位 U+00010000~U+001FFFFF
5字节 22~26位 U+00200000~U+03FFFFFF
6字节 27~31位 U+04000000~U+7FFFFFFF
  可以看出,对于BMP,最多正好用满3个字节的UTF-8,而加上代用对的扩展0X100000个字符,需要20位,4位的UTF-8已经足够表示了。
  UTF-8可以和老的ANSI格式相兼容,然后在指定位置说明自己是UTF-8,UTF-16如何做呢?可以在UTF-16的文本文件开始处先放两个字:FF FE或是FE FF,来表示这个文档是UTF-16的,它假定大多数文档是不以这两个字节开始的,否则也会发生误判。其中FF FE用来表示低字节在前,而FE FF表示高字节在前,这两个引导符叫做BOM(Byte Order Mark字节顺序标记)。FF FE(Unicode Little Endian从小的一端开始),FE FF(Unicode Big Endian从大的一端开始)。记不清吗,我是记哪个有E也就是有二进制一个0位的字节,表示大头。因为如果只有ASCII部分,则大头是00,全是0。你就知道FF FE表示00的字节要放到后面,也就是高字节在后了,是从小的一端开始;FE FF正相反,是从大的一端开始(注意不是小的结束、大的结束)。UTF-8的引导符为EF BB BF,按上述UTF-8的3字节编码来编码表示两字节高位在前的字则为FE FF,说明UTF-8是高字节在前的。在UTF-8中,FE和FF是在任何字节都不出现的,正好保留给了UTF-16的BOM,现在多数文本编辑器通过这个来认是不是UTF-16和UTF-8,余下的按系统默认的ANSI编码处理。
至少要成为本站的注册会员才能下载! 注册点我!
  • 上一篇: Unicode与Ansi
  • 下一篇: 利用VB实现AES算法
  • 发表评论   告诉好友   打印此文  收藏此页  关闭窗口  返回顶部
    热点文章
     
    推荐文章
     
    相关文章
    网友评论:(只显示最新5条。)
    河北宝宝网河北教育网址导航VB知识库点击申请点击申请点击申请点击申请点击申请点击申请点击申请
    点击申请点击申请点击申请点击申请点击申请点击申请
    Copyright© 2008 vbkbase.com All Rights Reserved QQ群:54150844
    冀ICP备08000517号