字符编码研究

原创 2015年11月20日 23:07:48

字符编码研究

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

一,相关概念
   在计算机的世界中,所有的信息都是由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 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA中字符编码研究

本文介绍字符编码转换问题。 基本概念 编码过程,字符串 strA 经过某个字符集 (charset) 编码后成二进制数据 (byte[]  binA)。 对应java 中就是: byte[] bi...

java字符编码转换研究(转)

java字符编码转换研究(转)   1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以"中文"两个字为例,经查表...

UTF-8、GBK、GBK2312等字符编码的区别和vim乱码等相关问题研究。

转自本人博客:xge技术博客 http://www.xgezhang.com/char_encodind_vim.html 关于字符编码的问题在做项目的时候经常都会出现,但一直没有很系...

字符编码-使用c#研究

作者:Lance.Liang    文章来源:博客园    发布日期:2008-09-15微软的那个臭屁的JOEL(就是写《JOEL说软件》的那个牛人)曾说:“每一位软件开发人员必须、绝对要至少具备U...

java字符编码转换研究

今天看了篇文章,觉得非常好,对java字符编码进行了深入解析,觉得很受用,分析给大家。**编码就像一部字典。因为计算机是由美国人发明,字符编码起先是为了满足美国开发者需求,我们现在键盘上a-z A-Z...

关于计算机字符编码的研究

关于计算机字符编码的研究 字符编码的发展史 常见编码方式 utf-8编码中的中文占几个字节 int型几个字节 Refer 字符编码的发展史 ASCII码:美国人首先对其英文字符进行了编码,也就是最早的...

java字符编码转换研究(转)

1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4...

java字符编码转换研究

转载自:http://www.cnblogs.com/lxzh/archive/2012/05/30/2526557.html 1. 概述 本文主要包括以下几个方面:编码基本知识,java...
  • lkx94
  • lkx94
  • 2014-12-23 14:15
  • 347

Java字符编码转换研究

1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)