最近,在本地启动公司另外一个项目时,发现项目JS文件居然报错一大片,这个不能容忍啊,所以立马着手百起来(以下为坊间流传方案,虽然部分可以解决,但是总觉得不是很到位,也就是没有找到点子上去。)
解决过程:在网上也找过很多关于JS乱码方面的文章,发现都不好使,原因在于每个解决方案肯定是基于当事人所遇到的乱码问题做出的解决方式,可能不适合于你,后来琢磨到乱码问题肯定是开发过程中某处编码没有统一的问题,那么采用最笨的方式,就是把开发工具的编码、服务器编码、项目编码都统一,问题不就可以解决了,实验证明确实如此,好了,开始设置:
一、统一服务器编码
由于这里用的是Tomcat服务器,所以以tomcat为例进行设置,在服务器中有两处需要设置:
找到tomcat的bin目录下的catalina.bat并编辑,新增-Dfile.encoding=utf-8
找到tomcat的conf目录下的server.xml并编辑,修改你项目用到的端口所对应的Connector,比如我这边用到的是8080端口,那么修改后内容如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
二、设置开发工具编码
找到IDEA的安装文件夹的bin目录,这里修改的是idea64.exe.vmoptions文件,通过编辑器编辑该文件,在文件内容单独起最后一行,输入
-Dfile.encoding=utf-8
三、设置全局和项目编码
打开IntelliJ IDEA,选择:File->settings->Editor->File Encoding,选择UTF-8。
四、设置TOMCAT启动项目时用到的VM option
打开IntelliJ IDEA,选择:Edit Configurations->Server->VM options: 添加
-Dfile.encoding=utf-8
五、设置Startup/Connection,Environment Variables
打开IntelliJ IDEA,选择:Edit Configurations->Startup/Connection->Run/Debug:
1.勾选pass environment variables;
2.添加参数:JAVA_TOOL_OPTIONS,值为-Dfile.encoding=UTF-8;
六、MAVEN项目编码设置
找到pom.xml文件中的properties元素,添加如下内容:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
经过以上五处的设置相信可以解决大部分乱码问题,好了,就这么多!!!
- - - - - - - - - - - - - - - -✂- - - - - - - - - - - - - -✂-- - - - - - -- - - - - - - -✂- - - - - - -- - - - - - - - -
但是,万万没想到,我的问题只解决了一半,日志里开始乱起来了,索性静下来,自己理了理:
第一,只有当前这一个项目会报错,其他项目正常;
第二,只有js文件中文会报错,其他中文均正常;
那么就是除项目外的配置都是没问题的,好吧,刚刚乘吃饭的功夫,仔细对比了,报错和没报错的web.xml文件中的配置,居然还真有不一样的地方:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--本地项目js中文乱码-->
<!--<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>-->
</filter>
咯,就是以上我注释掉的地方!!!
后面又查了forceEncoding的相关资料
官方解释:
Servlet 2.3/2.4 Filter that allows one to specify a character encoding for requests. This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form. (这句话就说你在html页面或表单中设置编码是没有用的)
This filter can either apply its encoding if the request does not already specify an encoding, or enforce this filter's encoding in any case ("forceEncoding"="true").(只要你设置了foreEncoding=true,则在代码中设置编码格式没用,)In the latter case, the encoding will also be applied as default response encoding on Servlet 2.4+ containers (although this will usually be overridden by a full content type set in the view).