免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1067 | 回复: 0
打印 上一主题 下一主题

常用字符编码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-23 17:42 |只看该作者 |倒序浏览

               
    常用字符编码    Write by Jack.Hao
我们看到的一切数据在计算机中都是以二进制的形势存在的,为什么却可以看到不同的字符呢?这就是字符编码的作用了。在早期计算机主要应用中所用到的字符很少,仅为26个英文字母和一些特殊的符号,要对这些字符进行相应的编码,我们只需要一个字节(8位二制数据,可能表示256个字符)而这以足够应符当时的需求。然而我们表示的时候只用到了后7位,首位为零,这样可以表示128个字符,这就是我们常听的ASCII码了。
各种字符编码的集合就字符集!

====== Write byJack.Hao===================-->

下面介绍几种常见的字符编码:

1.ASCII码:
  ASCII(American Standard Code
for Information Interchange,美国国家信息交换编码)码,主要应用于英文字符的编码。每一个ASCII码占8位(一个字节),最高位为0,这些字符在0~127之间,最多可表示128个字符。另位128个作为扩展,最高位为1时,表示的一些特殊的符号(图形符)。

  但随着计算机的发展,被各地所使用,而ASCII码缺少对各地字符编码的支持,这已不能满足人们的需求,为些各地ASCII码进行扩展或重新编码,从而产生了各种不同字符集,但它们都对ASCII中的字符提供了支持。

2.ISO8859-1
  ISO8859-1(又称Latin-1)编码,它是在ASCII码的基础扩展而形成的,又加上了对西欧字符的支持。其中0~127所表示的字符与ASCII码相同,只是又包含了128~255包含了西欧所用的一些字符。

3.GB2312与GBK
  这个编码大家应该不陌生吧~~
  GB2312是中国人民共和国国家标准汉字交换编码,由我国国家标准总局制定发布,适用于中国大陆和新加坡地区。为了和ASCII码区分,GB2312用两个字节表示,每个字节的最高位都为1。
GB2312中一共包括了6762个汉字,算上其它一些控制键和其它字符,一共7573个。GB2312将代码表分为94个区,对应第一字节。每个区94个位,对应第二字节。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94为等待扩展空白区。
     GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,位于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,位于56-87区,按部首/笔画顺序排列。
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
     为了对更多的字符提供支持,在1995年12月,我国又颁布了GBK(国标2312的扩展版)。,在这套字符编码中,除了全部兼容GB2312中的所有字符以外,还对繁体中文和许多特殊符号进行了编码。它是现在windows中文系统默认的字符集。其中共包含了20902个汉字,其编码范围0x8140-oxfefe。
在中国大陆使用的计算机系统上,默认将GBK和GB2312作为该系统的本地字符集。

====== Write byJack.Hao===================-->

每个地区都定义了自己的一套编码,平时还不会出什么问题,但一旦涉及到国际化,就会出现乱码问题。
例:你用GB2312写的文件拿到美国的电脑上还想看一下,就会看到乱码,因为美国人使用的编码中并没有包含你所写的这些字符。
为了解决国际化的问题,就特别需要一种全球统一的字符编码。

4.Unicode
  Unicode(统一字符编码集),由ISO(国际标准化组织)将全世界的编码进行了统一编码。它使用两个字节表示。0~65535,共可表示65536个字符。其中包括了中文,西欧字符,日语,韩语,阿拉伯语,希腊语等等,包括了世界上决大多数和的字符。其中定义了40000多个字符,其它25000多个字符作为以后的扩展。定义的字符中包括20000多个汉字,11000多个韩语字符,还有其它字符。
Unicode中0~255的字符与ISO8859-1一致。

这样就可以很好解决国际化中的乱码问题,只要用Unicode编写的文档然后拿到以地方再用Unicode码都可以正常的显示,而不再是乱码。

这样好是好,但也有一个问题,大家想想,用两个字符去表示一个英文字符,是不是有点浪费存储空间啊,因为一个足矣~~~

5.UTF-8
  既然Unicode这些浪费,大家就又在寻求一种新的字符编码来替代Unicode,这时UTF-8出场了!!
  UFT-8(Eight-bit UCS Transformation Fomrat),它是UCS(Universal
Character Set,通用字符集)的一个字集。
  它分三种情况:
    ASCII码保持原样,只占用一个字节。如果字符在0x0080~0x007f之间,它使用两个字节来表示,如果字符在0x0800~0xffff之间它采用三个字节来进行表示。例:如果为中文字符它会采用三个字符来表示。

既然它们同为国际化的编码,之间就可以进行转换,转换规则如下:
(1)如果Unicode的前9位是0,UTF-8用一个字节表示。UTF-8取Unicode码最后7位二进制数据,最高位补零。
例:Unicode:\u0035=00000000 00110101
   UTF-8:00110101=0x35H
(2)如果Unicode的5位为零,则UTF-8采用两个字节表示。UTF-8的第一个字节前的前三位为固定的110开头,第一个字节的后5位为Unicode编码去掉前5位后的最高5位。第二个字节前二位固定以10开头,第二个字节的后六位取Unicode码的最低6位。
(3)如果前两个都不行,那就只能转换为三个字节了。第一个字节以1110开头,第一个字节的后四位取Unicode码的最高四位。第二个字节以10开头,第二个这节的后六位为Unicode码的5-10位。第三个字节也以10开头,第三个字节的后六位取Unicode的最后六位。

注意(1),(2),(3)顺序的含义,能转换为一个字节它当然不会转换为二个字节。


====== Write byJack.Hao===================-->

本文只是初略的介绍了几个常用的几种字符编码,常见的还有UTF-16,它是在Unicode编码的基础之上扩展形成的一种新的字符编码。UTF-16编码扩充并没有影响Unicode编码,一个用Unicode编码的字符就是UTF-16格式。如果大家想详解了解各种编码的底层,可以在网上搜索一下,很多的吗~~~

注意:国际化的编码,如UTF-8,Unicode,UTF-16,虽然在国际化时方便很好,但它也不会完全替代 本地编码。如Unicode表示一个英文字符也要2个字节,这样美国人会乐意的。UTF-8表示一个汉字却要三个字节,同样我们也不乐意。
所以说在相当长的一段时间内国际化编码和本地编码将长期共存!


参考书籍:Java Web开发详解 孙鑫

转载请说明出处。。。。。。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/38934/showart_388212.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP