http://blog.csdn.net/renfufei/article/details/11294917
最近在维护着Linux上的服务器,当然,开发和前期测试是在windows上执行的。
在做意见反馈的时候,出现了windows上正常,Linux下却是乱码的问题。
先排查了web服务器与MySQL的连接,确认问题处在前端页面和web之间的乱码交互。
前端的代码如下:是jQuery的跨域提交。
- $(function(){
-
- var $btn_green = $(".btn_green");
- var $content = $(":input[name=content]");
- var $nickname = $(":input[name=nickname]");
- var $linktel = $(":input[name=linktel]");
-
- $btn_green.click(function(){
-
- var content = $content.val();
- var nickname = $nickname.val();
- var linktel = $linktel.val();
-
- if(!content){
- show("亲,请填写内容哦!");
- $content.focus();
- return false;
- }
-
- var url = "http://dev3.mywebsite.com:80/api/feedback?";
- url += "content="+encodeURIComponent(content);
- url += "&nickname="+encodeURIComponent(nickname);
- url += "&linktel="+encodeURIComponent(linktel);
- try{
- $.getScript(url);
- } catch(e){
-
- }
- close_feedback();
- $content.val("");
-
- show("感谢您的建议与反馈!");
- });
-
- function show(message){
- if(message){
- alert(message);
- }
- };
- });
页面编码是UTF-8。 提交以后,在servlet里面:
-
- request.setCharacterEncoding("UTF-8");
-
- String content = request.getParameter("content");
- String clientIp = request.getRemoteAddr();
- String nickName = request.getParameter("nickname");
- String linkTel = request.getParameter("linktel");
-
- System.out.println("content="+content);
发现在windows上是正常的,而linux服务器里面就是乱码。
于是在Servlet加上转码,linux好了,而windows又出现乱码了。
- String srcChar = "ISO8859-1";
- String dstChar = "UTF-8";
- title = new String(title.getBytes(srcChar),dstChar);
- content = new String(content.getBytes(srcChar),dstChar);
- nickName = new String(nickName.getBytes(srcChar),dstChar);
- linkAddress = new String(linkAddress.getBytes(srcChar),dstChar);
-
确定问题应该处在Tomcat的配置上,于是翻开两个conf/server.xml 对比,发现:
-
- Service name="Catalina">
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" URIEncoding="UTF-8" />
-
- <Connector port="8099" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
而Linux 的配置缺少了URIEncoding的配置项,那么默认应该是"ISO8859-1",所以如果没有配置,则需要转码一次。
-
- <Service name="Catalina">
- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="250" minSpareThreads="20"/>
- <Connector port="80" protocol="HTTP/1.1"
- connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata"
- ompressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/javascript,application/x-javascript"
- />
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool"/>
同理,如果在Linux上的Tomcat 加上URIEncoding="UTF-8" 就好了。
结论: 约定很重要,网站一般采用UTF-8作为默认编码。如果不是特殊需求,不要变换成其他编码。