前言
之前总是被idea的乱码困扰。也试过很傻的把文件内容拷出来,拷到写字板,再拷回去。以为会有用。也配过File-settings里的编码设置,也配过Edit Configurations里的vm -options
,但是由于日志还是会乱码,所以一直没搞懂这各种配置的作用。
今晚出现的这个问题,摸爬打滚中,搞明白了。总算是搞明白了,怎么设置系统默认编码,以及明白了日志中中文乱码的可能的原因。
背景
写接口时,将项目部署在本地tomcat跑起来,作为服务端提供接口,然后再用一个test方法作为客户端去访问服务端的接口。然后发现,由于项目部署的位置和tomcat不在同一个盘。所以,客户端日志生成在e盘,服务端日志生成在d盘。然后,通过输出系统默认环境编码:
logger.info("获取系统默认编码:" + System.getProperty("file.encoding"));
发现,客户端默认编码是UTF-8,服务端默认编码是GBK。
乱码的一个原因,可能是两端生成字符串与解析字符串时使用了不同的编码。
由于客户端中的加密方法中,将字符串转成了字节数组,代码如:
byte[] bytes = data.getBytes();
服务端的解密方法中,将字节数组转成了字符串,代码如:
String data = new String(bytes);
由于都没有指定编码,因此使用的是系统默认编码,而由于我客户端和服务端的编码不同,因此在服务器端解析出来的数据如果是中文,就会出现乱码。
第一个问题
于是!!
我想把服务器端的编码改成UTF-8,这样就不会在传输中对字符串的处理中由于编码问题而导致的乱码。
百度了一下,如设置File-settings中的那三种编码,都设为UTF-8。但是服务器端这边依然是GBK。最后发现是绿色启动键左边,选择tomcat服务,然后在Edit Configurations里,设置vm options
为-Dfile.encoding=UTF-8
:
这样,服务器端的默认编码就是UTF-8了!!!
但是,这出现了新的问题!!就是去日志里一看,会发现,虽然系统默认编码输出是UTF-8,但是中文字符全部乱码了!!!这是一个问题。
第二个问题
后面,我在分离接口的时候,把一部分的接口作为新的项目,放在了跟idea同个盘的d盘。然后,同样是测试,这次,客户端和服务器端的都在d盘,因此生成了日志都放在了同一个文件。然后测试,查看日志,发现,服务器端的日志部分,只要有中文就会乱码!!!一看,服务器端的默认编码是GBK,而客户端的默认编码是UTF-8。于是我像上面说的,配置vm -options
,设为UTF-8。然后再测试,发现,还是乱码,而且乱得完全更恐怖了。可是控制台输出的中文字符是正常的!!这是第二个问题。
这里卡了很久。一直在纠结是不是哪里还没配对!!搞了很久,都没搞出来。客户端和服务器端的日志明明都已经都是UTF8了,可还是会乱码。
问题所在
最后,先把两端都配成UTF-8,然后把日志删除,即重新生成日志,这时发现!!不乱码了!!!!才明白,因为文件的加载已经指定了一种编码,然后如果用了另一种就会出现乱码。
对于第一个问题,一开始服务器端的日志是GBK的,后面改成了UTF-8,但是原本的日志已经是GBK,所以,即使改成了UTF-8,由于跟文件的编码不一样,所以还会出现乱码。这个乱码是由于文件的编码跟新增的信息的编码不同导致的乱码。
对于第二个问题,其实跟第一个问题一样。就是因为客户端生成的日志信息是UTF-8,而服务器端生成的是GBK,由于先生成服务器端日志,两端的编码不一样,但是写到同一份文件,于是出现乱码。后面即使都改成了UF-8,我想应该是由于文件是GBK的方式去加载的,所以,UTF-8编码写入,还是乱码。
感想
这次收获真的蛮大的。
我把日志删掉,重新生成,并保证两端编码是一样的,这样,就不会乱码了。也就是说,写入文件时,要使用同样的编码!!
另外,前面提到的:
byte[] bytes = data.getBytes();
String data = new String(bytes);
由于两端的编码不同导致的解析乱码,这个我觉得很重要,要记住,这样,之后出现乱码的时候,才知道是怎么回事。
刚刚差点就想把项目删了重新写过(因为没办法了,觉得这样可能会成功,但是即使成功了,我依然是不懂的)。所以说,对于乱码问题,我觉得我又进步了一些,哈哈。