记一次抓狂的乱码经历

常年Eclipse的守旧派久闻IDEA大名,终于在dalao的安利下入了IDEA的坑((才不是因为可以用翻译插件


入坑一段时间,因为在编码方面了解的还算比较多,平时基本没遇到过乱码问题,并且在第一次使用IDEA时就修改了设置中所有编码方式为UTF-8,直到最近做一个小小的javaweb项目,遇到了很奇怪的问题,平时本人都保持使用UTF-8的习惯,各种编辑器都是默认UTF-8编码,这次出问题的是两个html文档与两个js脚本,均为UTF-8编码,在本地使用浏览器打开时一切正常,但是放到IDEA中,加上设置请求与响应的编码的过滤器后,在浏览器中打开页面上的中文竟然乱码了,确定这个问题存在的时候实在非常诧异,在仔细检查过自己的各种设置,代码以及文件编码后确信没有问题,通过浏览器中的开发者工具可以看到AJAX请求得到的响应数据中的中文是正常的,只是html与js这两种静态资源乱码了,尝试去掉设置编码的过滤器后,更神奇的事出现了,html与js的不再乱码了,但是通过AJAX请求得到的响应数据中的中文却又乱码了(崩溃)。

在做了各种排查后实在不知道问题发生在哪里,于是猜测会不会是运行环境的问题(JDK10.0.2 + Tomcat9.0.11),当把运行环境换为(JDK1.8_171 + Tomcat8.5)后,启用设置编码的过滤器,乱码问题竟然奇迹般的消失了。

于是只能将这个问题暂时归结为环境问题或者是这个项目有问题了。。


晚上吃饭回来,重新建了个项目,用的疑似有问题的环境,一步一步小心的重新建立了之前这个项目的结构,编译,运行,还是老样子,html与js乱码,ajax响应正常,于是开始疯狂百度,终于在一位前辈的博客中看到了相似的问题:

IDEA启动TOMCAT静态页面时乱码

前辈的解决分三步:

1.修改IDEA设置中的几个默认编码(这个我在安装后接着就设置了)

File-->Settings-->Editor-->File Encodings

将这三个地方都设置成UTF-8,使文件的编码格式都是UTF-8(不过这个貌似跟Tomcat乱码没多大关系)

 


 

2. 在VM options添加:-Dfile.encoding=UTF-8,并且将下面两个属性设为Update classes and resources (这个我只设置了前半句,后边这俩个人认为和编码无关就没有动)

在设置了Tomcat的VM选项后,静态资源乱码的问题消失了,根据对这个参数的一知半解,个人认为是:Tomcat是运行在JVM的基础上,因此受JVM参数的影响,由于我的系统是Win7简体中文版,系统默认编码为GBK,因此JVM在不指定这个选项的情况下,也将读取系统默认编码作为自己的默认编码,Tomcat则使用此默认编码作为读取普通资源文件时的默认编码,这就导致了我的UTF-8格式的html与js文件被Tomcat以二进制读取并使用GBK进行了错误解码得到乱码字符文件,随后又通过UTF-8编码解码将这堆乱码呈现到了浏览器。

根据上述猜想进行实验,将我的html文件保存为GBK编码格式,js保持UTF-8不变,去掉这个VM选项,启动Tomcat,果然,html文档显示正常,通过开发者工具查看加载的js文件,里面的中文仍然是乱码,因此可以肯定,Tomcat 9中默认处理静态资源的Servlet使用了JVM提供的默认编码来读取了静态资源,通过VM选项指定文件编码为UTF-8后即可解决这个问题。

 


 

3. 在第二步操作过后,会发现Tomcat在IDEA控制台的启动输出中的中文(信息、警告等)变成了乱码。第三步就是将IDEA的启动选项中也加上这个VM选项(类似Eclipse中在ini中加这个选项)

安装目录\bin下,加破解补丁时的那两个文件(32/64)(*.vmoptions),就是用来为IDEA的启动指定VM选项的,在这两个文件中也加上这行,启动,运行,完美!一切乱码都消失了~

 


 

反思与总结

 通过这次的乱码问题,也算是得到了一点经验,在日后的学习中,凡是基于JVM运行的程序,如果需要统一编码,都要尽量加上这行VM选项,从而保证不会出现莫名其妙的乱码问题,在设置了这个选项 后也要注意将软件中有关编码的设置一并统一,以免出现其他问题。

 


 

-Dfile.encoding=UTF-8

 

posted @ 2018-08-26 22:17  Leroscox  阅读(1382)  评论(1编辑  收藏  举报