0706日志乱码问题

前言

之前总是被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);

由于两端的编码不同导致的解析乱码,这个我觉得很重要,要记住,这样,之后出现乱码的时候,才知道是怎么回事。

刚刚差点就想把项目删了重新写过(因为没办法了,觉得这样可能会成功,但是即使成功了,我依然是不懂的)。所以说,对于乱码问题,我觉得我又进步了一些,哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值