加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

字符编码-ASCII GB2312 GBK GB13080 UNICODE UTF

(2014-12-31 17:10:41)
分类: C

字符:字符是文字与符号的总称,包括文字、图形符号、数学符号等。

字符集:常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集,中文字符集,日文字符集等。

字符编码:计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码。

一.几种常用的编码。

1)ASCII7编码编码0x00-0x7FASCII字符集包括英文字母、阿拉伯数字和点符号等字符。其中0x00-0x200x7F33个控制字符只支持ASCII的系会忽略每个字的最高位,只认为7位是有效位。HZ字符编码就是早期了在只支持7ASCII传输中文而设计编码。早期很多件系也只支持ASCII编码传输中文件必使用BASE64或者其他编码方式。

 

2GB2312我们聪明的中国人一眼就看出博大精深的中文字符怎么编码呢?这么简单的一个字节你能表示中文字符!别做梦了!谁让我们聪明呢,一个字符不行,可以用两个表示。聪明的程序员就提出了用两个字节表示一个中文字符。那么问题又出来了,怎么区分英文字符和中文字符呢?难道cpu是智能的不成?不,cup不是神仙,聪明的程序员把中文字符的两个字节的第一位设置为1,这样在处理中英文混和的字符时,只要发现某个字节的首位是1,就把两个字节表示为一个字符。说到这里,也许你已有点那么个明白的意思了。原来如此,GB2312也只不过是按照和ASCII相同的处理方式对字符处理,只不过是对中文有了两个字符,英文还和ASCII字符集的编码相同占一个字符。说了如此之多,才仅仅对GB2312一点点理解而已,请看下面对GB2312的说明:

GB2312是基于区位码设计的,区位编码表分94个区,每个区对应94个位,每个字符的区号和位号合起来就是该汉字的区位。区位一般10制数来表示,如1601就表示161位,对应的字符是。在区位的区号和位号上分加上0xA0就得到了GB2312编码。区位01-09区是符号、数字区,16-87区是字区,10-1588-94是未定的空白区。它将收字分成两:第一是常用3755个,置于16-55区,按汉语拼音字母/笔形序排列;第二级汉字是次常用3008个,置于56-87区,按部首/笔画序排列。一级汉字是按照拼音排序的,个就可以得到某个拼音在一级汉字区位中的范,很多根据字可以得到拼音的程序就是根据个原理写的。 

GB2312字符集中除常用字字符外包括希腊字母、日文平假名及片假名字母、俄西里字母等字符,未收繁体中文字和一些生僻字。可以用繁体测试某些系是不是只支持GB2312编码 

GB2312编码0xA1A1-0x7E7E,去掉未定的区域之后可以理解为实际编码0xA1A1-0xF7FE

 

3GBK 字集是繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。中国的字太多了,我很快就就发现多人的人名没有法在里打出来。于是我不得不继续 GB2312 没有用到的位找出来老不客气地用上。后来是不用,于是干脆不再要求低字一定是127号之后的内,只要第一个字是大于127就固定表示是一个字的开始,不管后面跟的是不是展字符集里的内容。展之后的编码方案被称 GBK 准,GBK 包括了 GB2312 的所有内容,同又增加了近20000个新的字(包括繁体字)和符号。

 

4) GB18030是国家制定的一个制性大字集,它的推出使字集有了一个大一准。GB18030编码向下兼容GBKGB2312,兼容的含是不字符兼容,而且相同字符的编码也相同。GB18030了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的文字符等等,也可以是世界大多民族的文字符号都被收在内。GB18030节编码0x00-0x7F,完全等同与ASCII;双字节编码的范GBK相同,高字0x81-0xFE,低字编码0x40-0x7E0x80-FE;四字节编码中第一、三字编码0x81-0xFE,二、四字0x30-0x39

 

5)UnicodeUnicode可以说是计算机字符编码的一个伟大变革,之所以说它伟大,就像大家说秦始皇伟大一样,秦始皇不但统一了六国,更统一了文字和钱币。那么Unicode可以说是世界上任何字符的一个集合。Unicode每个字符提供了唯一的特定数,不在什么平台上、不在什么件中,也不什么言。也就是,它世界上使用的所有字符都列出来,并每一个字符一个唯一特定数

 

6) utf-8。由于Unicode是一种双字节编码,可能有些非常不常用的字符再加到Unicode字符集了,两位字节都无法表示,因而可能需四个字节表示。这样,如果统一使用Unicode作为一种编码方式,确实太浪费。那么聪明的人类就想出了用utf系列的方式来编码unicode,也就是说utf8是对unicode的一种存储和传输编码方式。UTF-8最大的一个特点,就是它是一种变长编码方式。它可以使用1~个字表示一个符号,根据不同的符号而化字节长度。他是怎么样编码的呢?UTF-8编码规则简单,只有二条:

a.的符号,字的第一位设为0,后面7为这个符号的unicode。因此于英字母,UTF-8编码ASCII是相同的。

b.n的符号(n>1),第一个字的前n位都设为1,第n+1设为0,后面字的前两位一律设为10。剩下的没有提及的二制位,全部为这个符号的unicode

下表总结编码规则,字母x表示可用编码的位。

Unicode符号范 | UTF-8编码方式

(十六) | (二制)

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx10xxxxxx

0000 0800-0000 FFFF | 1110xxxx10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx10xxxxxx 10xxxxxx 10xxxxxx

下面,以例,演示如何实现UTF-8编码

已知unicode4E25100111000100101),根据上表,可以发现4E25在第三行的范内(00000800-0000 FFFF),因此UTF-8编码需要三个字,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从的最后一个二制位开始,依次从后向前填入格式中的x,多出的位0这样就得到了,UTF-8编码“11100100 10111000 10100101”转换成十六制就是E4B8A5

 

7)utf-16utf-32Utf-16utf-32Unicode16位和32编码方式。考到最初的目的,通常Unicode就是指utf-16(也就是说两位字节的unicode版本正好可以用utf-16体现,既utf-16的编码就是unicode码本身)

 

.对以上几中编码的一个总结:

1)我们可以把上面的asciigb2312, gbk, gb13080看成同一系列的编码,即从后往前都是兼容的,都是对原ascii中对应的字符采取一位编码,其他字符采取双字节编码。这几类编码可以统一理解位ascii系列的编码(本人自造的名词),因为他们在编程语言,甚至计算机处理过程种都是一样的。

2utf-8, utf-16, utf-32可以归纳位unicode系列的编码,因为这三种编码计算机中要找到他们对应的字符的话,都是对应到他们所表示的unicode码所对应的字符。

3utf-8中对应的原ascii中的编码和第1)项中里面涉及到的编码也是相同的,即对英文字符都是兼容的,为一个字节。

4)不要太过多的关注Unicode到底是一种字符集还是一种编码。这个概念网络上有的说的很绝对,即unicode只是一种字符集,不是一种编码。但是如果编码和其unicode值完全相同,我们把unicode认为是一种编码又有什么关系呢?况且windows中的记事本程序中就完全把文件保存成unicode编码格式的选项。如果非要硬说unicode只是一种字符集合,那么我们可以认为utf-16是我们平常所说的unicode编码。

 

三.程序开发,编译环境中采用的字符编码

其实这个问题很明确,在VC中,支持两种编码,一种是unicode形式的,一种是ascii形式的编码。比如你可以定义一个CString str1= “a中国”,这个str1会默认的编译为ascii形式。而如果你写成 CString str2= L“a中国”,这时候他就会是双字节的,可以认为是unicode形式的。因为VC中的unicode只有两位,没有对一些太不常用的字符支持。在苹果mac中,xcode对字符串是采用的utf-8编码。

http://blog.csdn.net/vcrwx/article/details/7656995

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有