字符集和编码

字符集和编码

)概述

字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,通常由不同国家的语言特征决定了一个字符集的总量。

由于在计算机内部,所有的数据在存储和运算时都要使用二进制数表示,所以必须用预先规定的方法将文字、数字、图像符号等字符转换成二进制的形式,即所谓的字符编码。由于转换对象(字符集)和编码规则(具体用哪些二进制数字表示哪个符号)的不同,产生了不同的字符编码。

 

二)ASCII

       全称为American Standard Code for Information Interchange,即美国标准信息交换码。

起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准,适用于所有拉丁文字字母。

       标准的ASCII码(非extended ASCII)用一个字节中的7位二进制码来表示所有的大写和小写字母,数字0 9、标点符号,以及在美式英语中使用的特殊控制字符,而最前面的1位统一规定为0。这个字符的编码就是ASCII码值,从00000001111111公有128个编码,可用来表示128个字符。

 

 

三)Unicode的产生

       SCII码一共只规定了128个字符的编码用来表示英文的字母和符号,但是却无法表示其他的语言。因此需要一种编码将世界上所有的符号都纳入到其中,是各种语言的交流成为可能,Unicode由此诞生。
       Unicode(统一码、万国码、单一码)是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,1990年开始研发,1994年正式公布。

 

四)Unicode的问题

      需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
      比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
      这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
      它们造成的结果是:
         1)出现了Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示Unicode。     

         2)Unicode在很长一段时间内无法推广,直到互联网的出现

 

五)UTF-8的产生

      互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
      UTF-8是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建,最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。     

UTF-8的编码规则很简单,只有二条:
      1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
      2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。



     

跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
      下面,还是以汉字"严"为例,演示如何实现UTF-8编码。
      已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100 10111000 10100101",转换成十六进制就是E4B8A5。

     

  

参考文献:

1.ASCIIUnicodeUTF-8http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值