

点击上方
蓝色
文字 关注我们吧!
经常有朋友或者同事抱怨说,从数据库查出来的数据乱码了,帮忙处理一下。然后我就开始了全面排查,排查数据库字符集,排查操作系统字符集,排查客户端字符集.....
那究竟为什么会乱码呢?他是怎么来的呢?带着这样的疑问,我们细说一下字符集
>>>>>>>>>>>
字符集的来历
我们知道计算机中只存储二进制数据,即0和1,如果要存储字符串(可以理解为各种语言,比如英文字母a,b,c. 或者是汉字)的化,就需要建立字符与二进制数据的映射关系。
在建立这个映射关系时,我们需要搞清楚映射的范围是什么,以及如何去映射。
映射范围顾名思义,指我们映射包含哪些内容,比如ASCII,一共收录128个字符,这128个字符就是所包含的内容。
映射,将一个字符映射成一个二进制数据的过程叫做编码,讲一个二进制数据映射为一个字符串叫做解码
我们则抽象出一个叫做字符集的概念来描述某些字符通过编码规则表示的范围。
我们来自定义一个名称为pingfan的字符集,按照上面所说,需要有编码规则以及范围。
范围“p,i,n,g,f,a”
编码规则:
'p' --> 00000001
'i' --> 00000010
'n' --> 00000011
'g' --> 00000100
'f' --> 00000101
'a' --> 00000110
有了以上的字符集,我们就可以在计算机使用我们自己的字符集来存储,表示了。
’fan' --> 000001010000011000000011
'ni' --> 0000001100000010
简单吧!
>>>>>>>>
比较规则
字符集我们弄清楚了,但是日常中,我们还是要进行字符之间的比较的,计算机中最容易比较就是两个字符对应的二进制数据的大小,比如我们自定义字符集pingfan中,'p','i' 的比较,i>p,因为00000010 > 00000001。有个专有名词叫做二进制比较规则
如果比较的是大小写字母、特殊字符以及汉字,这样复杂的情况,就需要制定出相应的比较规则,对于同一个字符集来说,比较两个字符大小的规则可以不止一种。也就是说,同一字符集可存在多种比较规则。这一点一定要注意!
>>>>>>>>
说说乱码
其实理解起来也很简单。场景来说,都是客户端与服务端交互。客户端发送服务端字符串采用一种字符集编码,而后服务端发送客户端字符串采用另一种字符集解码。这就是乱码的根源。
我们来看“人”这个字符,从utf8到gbk之间发生了什么。
在utf8编码表中查“人”编码为:0xE4BABA。
-->以下为GBK中解码过程(GBK表示一个字符最大为2字节)
首先看第一个字节0xE4,转换为十进制大于127,说明是两字节编码(一个字节在计算机中占用8位,最大值为11111111,转换为,十进制即127),那么继续读下一个字节。为0xE4BA,在GBK编解码表中查到对应的字符为"浜"。
继续读下一字节0xBA,转换为十进制大于127,说明是两字节编码,继续读下一字节,发现没有了。这时候只有半个字符了。因此,utf8中的字符"人",在GBK中为"浜"及半个字符。
是够乱的!!!