因为工作上要解决乱码问题,所以研究了一下字符编码方式转换的问题,然后发现越陷越深。这里只能先进行一些概念上和常见知识上的总结。
字符编码方式起到的作用就是让人类自己的符号(字符、数字、图案)能够存储到计算机中,因为计算机只能识别0101....,所以前辈们将符号和二进制结合到了一起,就像二进制码"0100"对应的是人类世界中的数字"4"一样,计算机它知道4是什么吗?它不知道,但是它可以将人类输入的4转换成0100存储在自己内部,然后再将内部的0100转换成4输出给人类看,它只是进行了一个逻辑上的转换,而却不知道自己再做什么。
按照上面的描述,只需要将自己需要的符号映射到唯一的二进制码即可,那么我们可以在计算机上使用的符号就会越来越多,一个、一百个,这些越来越多的字符形成一个集合,这就是字符集。但是这个集合到底要有多少个字符才够用,这取决于使用者的想法,比如老美就需要英文大小写、数字、控制字符和一些常见符号,那么这个字符集里面就存128这字符就够了,把这128个字符都映射到唯一的二进制码上,这就是最初的ascii编码与其字符集。不过随着计算机普及全世界,各个地区的语言符号数量可比acsii字符集能容纳的多很多了,但是老美不管,人家自己够用就行,你想用就用我们的ascii编码就好了。这肯定不能忍,于是全世界各地区的使用者都开始创建适合自己地区使用的字符编码方式和字符集,这才出现GBK、GB2312等诸多编码方式。
随着世界多元化交流,大家在电脑上沟通时发现,交互信息总是无法正确的显示,其实就是各地区的字符集和字符编码方式没有统一造成的,于是大家又开始进行不同字符编码方式的转换。但是这样效率很低,如果能将全世界的语言中的字符都放在一个字符集中,且使用统一的字符编码方式,那么全世界人民使用电脑交流就更便捷了,于是unicode字符集出现了。
Unicode简介 : 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
unicode字符集中的字符是很多的,所以会出现一个字节的二进制码是不够表示字符的,甚至需要两个字节,四个字节表示,如果所有字符都使用四个字节(或者更多的字节数)表示,那么信息数据就会变得很大,这是要规避的。于是大神们为这个超大字符集设计了独特的字符编码方式,UTF-8、UTF-16和UTF-32,UTF是Unicode Transformation Format的缩写。
Unicode可以使用的编码方案有三种,分别是 : UTF-8 : 一种变长的编码方案,使用1-4个字节来存储,具体的表现形式为 0xxxxxxx 单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的 110xxxxx 10xxxxxx 双字节编码形式(第一个字节有两个连续的 1) 1110xxxx 10xxxxxx 10xxxxxx 三字节编码形式(第一个字节有三个连续的 1) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节编码形式(第一个字节有四个连续的 1)。 UTF-32 : 一种固定长度的编码方案,不管字符编号大小,始终使用4个字节来存储,足以容纳所有的 Unicode 字符,所以直接存储 Unicode 编号即可,不需要任何编码转换。浪费了空间,提高了效率。 UTF-16 : 介于UTF-8和UTF-32之间,使用2个或者4个字节来存储,长度既固定又可变。 Unicode编号范围(十六进制) 具体的Unicode编号(二进制) UTF-16 编码 编码后的字节数 0000 0000 ~ 0000 FFFF xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 2 0001 0000---0010 FFFF yyyy yyyy yyxx xxxx xxxx 110110yy yyyyyyyy 110111xx xxxxxxxx 4 参考博客 C语言:Unicode字符集 Unicode详解 简单几句话总结Unicode,UTF-8和UTF-16
在中国地区,windwos默认使用的编码是GBK编码,其实windows本身可以设置系统使用utf-8为默认编码,但是使用GBK为默认编码的太多了(一般用户不会主动修改这些系统设置),不可能让大家统一修改,于是在程序数据上,就不可避免的需要进行字符编码方式的转换。
多字节是指使用多个单字节表示一个字符。宽字节一般是固定使用x个字节表示一个字符。
gbk编码中的一个汉字占两个字节,正好是一个宽字节,所以utf-8和GBK的转换,可以理解成多字节与宽字节的转换
除了GBK,还有GB2312,GB18030和unicode。GBK、GB18030和GB2312都是汉字编码标准,而Unicode是另一种全球通用的字符编码标准。
GB2312是GBK和GB18030的基础,它只支持常用的汉字,而且是简体字。GBK在GB2312的基础上进行了扩展,支持繁体字和生僻字。它采用双字节表示,总计23940个码位,共收入21886个汉字和图形符号。GB18030编码在2000年取代了GBK1.0,正式成为国家标准。GB18030编码格式有单字节、双字节、四字节三种方案,其中单、双字节的编码和GBK完全兼容。Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。但是,Windows的内核已经采用Unicode编码,这样在内核上可以支持全世界所有的语言文字。由于现有的大量程序和文档都采用了某种特定语言的编码,例如GBK,Windows不可能不支持现有的编码,而全部改用Unicode。
在程序中,一般最好使用unicode字符集显示字符,Windows的内核就是用unicode编码的,unicode字符集包含了世上大多数字符。unicode在windows下的不同本地环境下都能是正常显示。
在使用字符串和其他程序进程(本地进程或者远端进程)进行交互时,最好使用utf8编码方式的字符。原因是utf8可以表示最多的字符,所有系统通用,且不像宽字节一样每个字符都要两个字节表示,数字和字母等都是使用一个字节表示,有时可以节省大量字符串流。