浅谈乱码原因及解决方案
前言
其实作为程序猿来讲,中国的程序猿遇到的问题可能会比国外的程序猿遇到的问题多很多。
一个原因是因为各种标准的制定、各种IDE的编写,都是由老外来完成的,制定出来的东西可能和中国人的习惯不太一样;还有一个原因就是因为国际编码的问题,通常,外国人写的东西无需对编码进行转换,默认的就是ISO-8859-1;到了中国,就涉及到本土化的问题,中文编码应当是GBK,这是本地化的编码。
而各种标准、各种浏览器一般用的都是ISO-8859-1,所有就造成了两种编码之间的转换。所以后来出现了UTF8,来解决各种编码问题。UTF8基本上包含了地球上所有的可见字符,十分强大。
但不幸的是,各种标准并没有按照这一编码来制定,而依然沿用以前的做法。
所以,解决各种乱码问题,就成了中国程序猿的必不可少的技能之一。
这篇文章,就是要和大家讨论种种乱码问题出现的原因,以及相应的解决办法,我目前已知的情况共有三种,下面就位大家一一讲解。
IDE环境造成的乱码
其实这个是非常让人郁闷的问题,有时候还真的很难发现。现在流行的两种JavaIDE,idea和eclipse。idea的所有默认编码都是UTF8格式,基本上统一所有编码,如果你再idea出现了乱码问题,一般不是idea自身的问题。
如果你看到idea的控制台出现了中文乱码,这很有可能是你选用的字体不支持部分中文造成的,idea不背这个锅。
对于eclipse,这货可能是为了让中国人写代码的时候更加方便,当你点击目录中的src,然后点击file->Properties->Resources,你会看到,TextFile Encoding默认是GBK。是不是很绝望,为了下次不再因为这个问题产生乱码,记得创建文件夹以后就配置一下src的encodeing,还是刚刚的那个路径,改成UTF-8就行了。
也许你会说,我根本就没发现这里有什么问题啊,我一直是这种设置也没有发生过乱码。我只能说,那是因为你没有遇到过。
最常见的一个场景就是web应用中(不使用框架),当你提交的表单中存在file域的时候,你可能会使用一些文件上传组件,这些组件处理信息的时候,会将表单中的数据变成UTF8或者你设置的格式,但是,如果你的文件编码是GBK的话,就肯定就会碰到乱码的问题了。具体原因有待深究,但个人觉得这可能是因为编译后的class字节码文件处理信息过程的问题。
POST和GET方法传递参数造成的乱码
如果你发现更改了文件编码并且重新build以后,还是出现乱码的问题,如果依然是web应用的话,那就很有可能是POST和GET方法传参造成的乱码。
这个问题可以看我的文章,POST和GET方法乱码问题解决方案,写的其实非常详细了。
数据库编码格式导致的
如果你发现,你从数据库中读取出的数据是乱码的,那么原因也很简单,是因为数据库的字符集配置问题。
首先,进入mysql的控制台,也就是命令行中。输入如下语句,查看mysql的字符集配置。
- 方法一:show variables like 'collation_%';
- 方法二:show variables like 'character_set_%';
如果你看到,字符集列表中有显示各种字符集的配置都是拉丁文,也就是lantin这样子的。那么毫无疑问是因为字符集的配置问题了。对于不同的系统,配置的方法都是相同的,那就是找到mysql文件的配置信息路径,一般linux可以按照我的这篇文章来进行配置,windows也可以参考,只需要找到配置文件,做最后的字符配置操作即可。windows的mysql配置文件一般在mysql的安装目录下,如果没有,那么可以自己建一个名为my.cnf的文件(如果无效,试试新建mysqld.cnf文件),然后在文件中输入如下配置信息:
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
文章链接:mysql乱码解决方案
结语
好了,这次的文章就到这里了,如果你喜欢我的文章,请关注我,可以点个赞,支持一下我。想和我交个朋友的,可以邮件联系我roobtyan@outlook.com。感谢您的阅读,再见!