关闭

常用字符编码

654人阅读 评论(0) 收藏 举报

常用字符编码      Write by Jack.Hao

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

各种字符编码的集合就字符集!

 

<!--=========================== Write by Jack.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.GB2312GBK

这个编码大家应该不陌生吧~~

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以示区别。
    
为了对更多的字符提供支持,在199512月,我国又颁布了GBK(国标2312的扩展版)。,在这套字符编码中,除了全部兼容GB2312中的所有字符以外,还对繁体中文和许多特殊符号进行了编码。它是现在windows中文系统默认的字符集。其中共包含了20902个汉字,其编码范围0x8140-oxfefe

在中国大陆使用的计算机系统上,默认将GBKGB2312作为该系统的本地字符集。

 

 

<!--======================== Write by Jack.Hao=======================-->

 

每个地区都定义了自己的一套编码,平时还不会出什么问题,但一旦涉及到国际化,就会出现乱码问题。

例:你用GB2312写的文件拿到美国的电脑上还想看一下,就会看到乱码,因为美国人使用的编码中并没有包含你所写的这些字符。

为了解决国际化的问题,就特别需要一种全球统一的字符编码。

 

 

4.Unicode

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

Unicode0~255的字符与ISO8859-1一致。

 

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

 

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

 

5.UTF-8

  既然Unicode这些浪费,大家就又在寻求一种新的字符编码来替代Unicode,这时UTF-8出场了!!

  UFT-8Eight-bit UCS Transformation Fomrat,它是UCSUniversal Character Set,通用字符集)的一个字集。

  它分三种情况:

    ASCII码保持原样,只占用一个字节。如果字符在0x0080~0x007f之间,它使用两个字节来表示,如果字符在0x0800~0xffff之间它采用三个字节来进行表示。例:如果为中文字符它会采用三个字符来表示。

 

既然它们同为国际化的编码,之间就可以进行转换,转换规则如下:

(1)如果Unicode的前9位是0,UTF-8用一个字节表示。UTF-8Unicode码最后7位二进制数据,最高位补零。

例:Unicode/u0035=00000000 00110101

   UTF-8:00110101=0x35H

(2)如果Unicode5位为零,则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 by Jack.Hao===========================-->

 

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

 

注意:国际化的编码,如UTF-8UnicodeUTF-16,虽然在国际化时方便很好,但它也不会完全替代 本地编码。如Unicode表示一个英文字符也要2个字节,这样美国人会乐意的。UTF-8表示一个汉字却要三个字节,同样我们也不乐意。

所以说在相当长的一段时间内国际化编码和本地编码将长期共存!

 

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

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

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17918次
    • 积分:306
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条