ASCII,UNICODE与UTF-8

  信息在内存中是以二进制形式存放的,日常使用的文字和符号对应到成二进制的字节流叫做字符集(character set),而使用字符集进行转换叫做编码(encoding),注意区分这两个概念。阮一峰的那篇《字符编码笔记:ASCII,Unicode和UTF-8》还不错,但因为windows的命名混乱(比如将带BOM的UTF-16称作UNICODE,将windows code page称作ANSI)试图用windows的命名来解释概念是不可能解释得请的。(WINDOWS为了兼容性简直丧心病狂,因此造成标准的混乱也是必然的。)

  1. ASCII
   ASCII(美国信息交换标准码)是上个世纪60年代建立的一套7位编码标准,将128个字符对应到从00H到7FH的128个ACSII码上。它既是一个字符集又是一种编码方式。然而128个字符远远不够日常使用,于是在ASCII的基础上进行了扩充,用80H到FFFF来表示其他的65152个字符(实际使用时没用到这么多,比如GBK的范围是8140-FEF),几十年前计算机还不发达,各个地区对于扩充的需要不同,制订了不同的字符集,比如中国大陆使用gb2312,台湾搞了一套类似的BIG5,日本使用JIS。微软使用code page(被微软称做ANSI,但实际这概念毫无意义),在不同windows语言版本中使用不同的默认code page来进行编码 。

2.UNICODE

  编码就像语言一样,不同地区使用不同的编码,就无法直接进行交流,比如你把中文文本经GBK编码后放到windows日文版里只会解释出乱码。为了解决这一问题,国际组织建立了一套统一的,囊括所用地区常用字符的UNICODE字符集。它用两个字节长的UNICODE码来对应一个字符,因此一共可包含2的16次即65536个字符,而同时期,国际标准化组织(ISO)(对,ISO9001质量认证就是这货搞的)同时制订了一套类似的UCS字符集。而他们认识到同意标准的重要性后, unicode2.0后基本和ISO 10646的规范保持了一致,只有细节上有不同。


3.UTF-8 UTF-16

  UNICODE只是规定了一套字符集,但具体怎么用(比如一个字符在内存中占几字节,是高位放前面还是低位放前面)还需要规定。于是,针对UNICODE字符集,规定了UTF-8,UTF-16,UTF-32的编码方式。其中UTF-16相对简单,直接用UNICODE码存来表示字符。所以UTF-16编码下的所有字符都是两个字节。这也带来了两个问题:(1)假如有个编码是0X4F81,那么在内存中应该保存为0X4F,0X81,还是0X81,0X4F呢?(2)之前广泛使用的ASCII码都是用1位字节来表示英文字符。而UTF-16要用两位,这就导致了与原来编码的不兼容。

  问题1,将UTF-16分为BE/LE两类,BE代表大头方式存储,即低位地址存放高位字节,LE代表小头,与BE相反。

  而问题2,为了与ASCII码兼容,采用了UTF-8的编码方式,这也是为什么UTF-8是现在主流的原因,同时,UTF。

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

  实际上UNICODE是非常复杂的一整套技术,UTF只一种非常简单的编码方案,不过这里就不展开了。

  同理,对于UCS字符集,也有UCS-2,UCS-4的编码方式,分别与UTF-16和UTF-32相似。                                                                                                                                                


4.BOM

  windows在存储文件时,为了方便标识文件编码类型,在文件头部加了字节顺序标记(ByteOrderMark),用特定的标识符标识编码方式。如:

UTF-16 BE: FE FF  

UTF-16 LE :FF FE

UTF-8        :EF BB BF



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值