字符编码研究

3 篇文章 0 订阅

字符编码研究

   
     应用开发中,经常会遇到乱码的问题,对于新手尤其如此。为了解决乱码问题带来的困扰,特整理一下字符编码的相关知识,从根本上杜绝乱码的出现。

一,相关概念
   在计算机的世界中,所有的信息都是由01组成的二进制信息,当然也包含字符。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。那么如何将这些字符转换成计算机理解的二进制信息就是编码过程,如何将二进制信息转换成我们理解的字符就是解码过程。比如怎么把“汉字”转换成二进制,怎么把0xBABA解释成字符。
   
   字符集(Charset)简单的说就是字符的集合,集合中的每个字符都有一个码位值表示它在字符集中的坐标,通过这个坐标就可以唯一的确定一个字符。常见的字符集有ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等等。由于世界上存在非常多种的语言、文字,所以字符集也是百花齐放、形态各异。

   字符编码(Character Encoding)就是字符集中的字符与计算机中的二进制信息互相转换的规则。

    举个栗子,Unicode字符集包含了世界上的所有字符,而UTF-8就是基于Unicode字符集的字符编码。当然我们也可以直接用字符集中的码位值表示字符编码,比如ASCII字符集中,字符A通过编码后的值为65,而A在ASCII字符集中的码位值就是65。一会儿再对Unicode和UTF-8做个详细的例子,就可以更好的理解这个问题了。

     有的地方把字符集与字符编码作为同一个概念,这样也是合理的,因为用他们都可以描述字符与二进制信息的映射关系,也就可以进行编解码。

二,字符集之间的关系
     1.计算机诞生于美国,所以他的“母语”就是英语。英文中一共有26个字母,算上大小写以及标点符号不足128个,以一个字节表示足够,这就是ASCII编码。ASCII 编码对于我们再熟悉不过了,具体每个字母对应码位是多少很多人都能背下来,它是全世界通用的一种编码方式,http协议就是基于ASCII字符集的。

   2.ASCII字符集只能表示128个字符,但是美国在欧洲的朋友们可不都是讲英语的,他们需要一些其他字符(认真你就输了),所以就有了我们熟悉的ISO-8859-1,这是好多平台的默认编码。其实ISO制定了一系列的标准,它们是 ISO-8859-1~ISO-8859-15。这些字符编码都是基于单字节的,所以最多可以表示256个字符。

   3.对于中国这个文化大国,常用的文字就有两千多,一个字节肯定是表示不过来的。于是我们就有了自己的编码GB2312,它是双字节编码的,包括6763个汉字和682个其它符号。

   4.后来,又对GB2312字符集做了扩展,于是有了GBK。GBK是兼容GB2312的,也就是说GB2312中的编码方式在GBK中被保留了下来。

   5.再然后,感觉GBK中还是缺少了一些特殊的符号图形什么的,于是又对GBK做了扩展。扩展后的字符集为GB18030,同样对之前的字符集是兼容的。GB18030中几乎包含了所有少数名族的文字图案以及特殊符号。

三,Unicode,UCS与UTF-8
  1, 每个语言区域用自己的字符集处理字符信息是没有问题的,但是在访问其它语言的内容就会出现错误。于是国际组织就设计出了世界通用的字符集Unicode。Unicode就是要表示世界上所有的字符,可以把它看成是所有字符集的并集,出现在不同字符集中同样的字符在Unicode中对应一个编码。

  2,Unicode的全称是"Universal Multiple-Octet Coded Character Set",基于通用字符集的思想有两种具体的实现,一个UCS-2和UCS-4。看名字就知道,UCS-2使用的是两个字节,而UCS-4使用的是四个字节。两个字节一共可以表示2的16次方,即65536个字符,几乎可以涵盖世界上所有的字符了,UCS-2就是最常用的Unicode编码方案。

  3,现实中我们经常会用各种聊天工具在网上与他人交流,所以字符就需要在不同的计算机直接传输。用两个字节表示一个字符看起来已经非常节省空间且方便使用了,但是它在传输中仍然存在确定。首先,对于最常用的英文字母等字符只需要一个字节表示就够了,不需要用两个字节,如果所有字符都用两个字节传输会浪费网络的带宽而且耗时。其次,如果接收端收到了两个字节,那么是第一个字节在高位还是第二个字节在高位呢(它有一种解决方法就是添加BOM)?UTF-8编码彻底解决了上面的两个问题,它是一种变长的编码方式,越常用的字符占用的字节越少。与哈夫曼编码的思想相同,所以对同样的一段文字编码,UTF-8编码后的期望字节数更少。表中就是UCS-2到UTF-8的编码规则

UCS-2编码(16进制)UTF-8 字节流(二进制)
0000 - 007F0xxxxxxx
0080 - 07FF110xxxxx 10xxxxxx
0800 - FFFF1110xxxx 10xxxxxx 10xxxxxx



推荐两篇文章,本文也有借鉴
1,http://www.cnblogs.com/imissherso/articles/640727.html
2,https://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值