`
xcy13638760
  • 浏览: 51489 次
社区版块
存档分类
最新评论

java web项目各种乱码的解决方案

 
阅读更多

一、前言

目前web项目中,很多乱码情况没有得到统一解决,或多或少影响开发效率和延长开发时间, 所以总结一下关于java web项目各种乱码情况的解决方案。


二、准备条件

1、一个普通的web项目 webProject;

2、一个web服务器 Tomcat。


三、分析各种乱码的情况

1、项目的编码格式和页面文件的编码格式不一样是否有冲突?

答:webProject项目的编码格式是“GBK” ,项目下的页面中的编码格式是“UTF-8”,实践发现,项目的编码格式和页面的编码格式不一样不会有任何问题,显示的中文没有乱码。

查看项目的编码格式可以在项目-->右键-->Properties--> Text file encoding框内显示的具体值就是项目编码格式。

查看页面文件的编码格式可以在页面-->右键-->Properties--> Text file encoding框内显示的具体值就是页面文件的编码格式。


2、页面的文件编码格式和页面内容的编码格式不一样是否有冲突?

答:<1>将页面文件编码格式改为“UTF-8”,页面的内容的编码格式改为“GBK”,具体如下:

  1. <%@pagelanguage="java"contentType="text/html;charset=GBK"pageEncoding="GBK"%>
  2. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1">
  6. <title>Inserttitlehere</title>
  7. </head>
  8. <body>
  9. 测试中文是否乱码!@#!@#
  10. </body>
  11. </html>
结果发现 乱码了,具体效果如下:


所以页面的文件的编码格式必须和页面内容的编码格式一样,否则显示肯定乱码。

<2>另外,如果页面中格式在eclipse显示 是好的,这个时候改变文件的编码格式也会乱码,如果非要改变文件编码的格式,可以这样: 先将显示正确的内容复制一份 然后修改文件的编码格式,这个时候文件内显示的是乱码,然后将复制的内容直接覆盖在这个页面中就好了。


<3>如果给将上面代码的pageEncoding改为"UTF-8"了发现显示正常了,所以可不可以这么说,页面显示是否乱码与charset指定的值无关?


<4>但是如果将上面代码的pageEncoding="UTF-8“这个属性直接去掉,然后显示效果,发现乱码了。 如果把contentType属性的值改为 contentType="text/html; charset=UTF-8" 试试效果,具体如下:


所以可以这么理解:在没有指定pageEncoding属性的时候, charset 将会被忽略,如果没有指定pageEncoding属性,那么页面就会按照charset的编码值来显示具体效果。


<5>如果charset指定的值是GBK ,这个时候由于没有pageEncoding 所以页面内容按照GBk编码显示,但是与文件编码格式不符合 ,索引导致乱码。具体效果如下:

<6>现在又有另外一种情况,如果pageEncoding指定了UTF-8 ,但是charset指定的是 GBK ,GB2312 这个时候页面显示不会乱码。


<7>但是如果charset指定的是iso-8859-1,这个时候页面显示就是乱码了,具体效果如下:


<8>但是如果charset指定的是big5,这个是页面显示只是部分乱码,具体效果如下:

所以BIG5只会会繁体或者没有繁体格式的文字敏感。


<9>现在再实验一下,把contentType属相也去掉,指定meta标签中content属性中的charset=UTF-8 ,具体效果如下:

一种另外格式的乱码显示出来了。。。


综上所述:在jsp中如果要显示正确的内容,并且保证其显示不乱码,必须要指定contentType 或者 pageEncoding 的属性与文件编码格式一致。并且如果他们都存在,那么pageEncoding必须与文件编码格式一致,contentType必须是中文编码格式才行。


3、通过URL传递中文参数的时候接收的乱码怎么解决?

答:<1>新建一个servlet 名叫encodeServlet,在encode.jsp中添加超链接传递一个参数 跳转到该serlvet。

超链接如下:

  1. <ahref="servlet/encodeServlet?param=中文">gotoservlet</a>

servlet接收参数,具体get方法处理方式如下:

  1. /**
  2. *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse)
  3. */
  4. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
  5. Stringparam=request.getParameter("param");
  6. request.getRequestDispatcher("../encode.jsp?param="+param).forward(request,response);
  7. }
调试之后发现,参数乱码了:


<2>这是因为参数通过url传递的时候是以http超文本协议传递的,它的格式是 iso-8859-1 ,所以可以设置tomcat服务器全局URL请求的格式,这样子所有的请求都会按照这个编码格式传递参数了。具体如下:

在tomcat安装目录的conf/server.xml中找到protocol="HTTP/1.1"的属性配置的连接器,在里面添加URIEncoding属性,具体如下:

<ConnectorURIEncoding="UTF-8"connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

URIEncoding ,顾名思义,它只针对 URL传递的请求,即get请求。。


<3>并且如果这么设置之后就不能再使用 param = new String(param.getBytes("iso-8859-1"),"UTF-8");转码了 这样反而又变乱码了。


<4>另外还可以在接收到参数之后,重新指定编码也可以,具体如下:

  1. Stringparam=request.getParameter("param");
  2. param=newString(param.getBytes("iso-8859-1"),"UTF-8");

调试页面,发现并没有成功,具体效果如下:

没有效果,,,为什么,?因为页面的内容编码是UTF-8的,但是URL它传递的时候只能传递iso-8859-1 的编码,如果直接传递UTF-8编码的内容,那么无论后台怎么转换都没有效果。 即使在servlet中重新指定charset 也无济于事。


<5>但是如果直接在地址栏输入: http://localhost:8080/webProject/servlet/encodeServlet?param=中文

并且修改一些代码,具体修改如下:

  1. response.setContentType("text/html;charset=UTF-8");
  2. Stringparam=request.getParameter("param");
  3. param=newString(param.getBytes("iso-8859-1"),"UTF-8");

然后运行效果如下:


这样子是没问题的。。


<6>但是如果非要使用new String()重新编码来实现接收中文怎么办呢?,可以修改源码,具体如下:

  1. request.setCharacterEncoding("UTF-8");
  2. Stringparam=request.getParameter("param");
  3. param=newString(param.getBytes("iso-8859-1"),"UTF-8");
设置字符编码格式 即可,具体效果如下:



实践证明,不管是超链接 跳转到servlet 还是直接在url输入中文跳转到servlet 只使用request.setCharacterEncoding("UTF-8"); 统一编码格式 都可以实现接收正确的参数。。

最开始一直以为request.setCharacterEncoding("UTF-8"); 只能处理post请求的参数,get请求的一样可以。


<7>既然这么有效果,那么为了避免重复的使用这行代码或者忘记使用而导致乱码,可以使用一个过滤器 统一处理任何请求的编码格式。一劳永逸。

具体FIlter代码如下:

  1. packagecom.struts2.util;
  2. importjava.io.IOException;
  3. importjavax.servlet.Filter;
  4. importjavax.servlet.FilterChain;
  5. importjavax.servlet.FilterConfig;
  6. importjavax.servlet.ServletException;
  7. importjavax.servlet.ServletRequest;
  8. importjavax.servlet.ServletResponse;
  9. importorg.apache.log4j.Logger;
  10. publicclassCharacterFilterimplementsFilter{
  11. privateLoggerlogger=Logger.getLogger(this.getClass());
  12. Stringencoding=null;
  13. @Override
  14. publicvoiddestroy(){
  15. logger.info("***************theCharacterFilterclass'destroy()isinvoking.***************");
  16. }
  17. @Override
  18. publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
  19. FilterChainfilterChain)throwsIOException,ServletException{
  20. request.setCharacterEncoding(encoding);
  21. response.setCharacterEncoding(encoding);
  22. filterChain.doFilter(request,response);
  23. }
  24. @Override
  25. publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  26. logger.info("***************theCharacterFilterclass'init()isinvoking.***************");
  27. encoding=filterConfig.getInitParameter("encoding");
  28. }
  29. }

然后web.xml的配置如下:

  1. <filter>
  2. <filter-name>characterFitler</filter-name>
  3. <filter-class>com.struts2.util.CharacterFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>characterFitler</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

<8>但是但是,实际开发中,上面的配置在处理get请求的时候 有些时候可以指定编码成功,有的时候指定编码失败, 成功率大概60-70%之间,至今不知道为何会这样。。。

解决方案:

使用js函数编码之后,然后后台解码即可,具体前台代码如下:

  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
  2. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>Inserttitlehere</title>
  6. </head>
  7. <body>
  8. 测试中文是否乱码!@#!@#<br/>
  9. <ahref="javascript:goTo()">gotoservlet</a>
  10. <script>
  11. functiongoTo(){
  12. varparam=encodeURI(encodeURI("中文"));//这里编码必须调用两次,因为传递后台后java程序会解码一次,然后自己还要解码一次,
  13. location.href="<%=request.getContextPath()%>/servlet/encodeServlet?param="+param;
  14. }
  15. </script>
  16. </body>
  17. </html>
后台解码代码如下:

  1. //request.setCharacterEncoding("UTF-8");
  2. //response.setContentType("text/html;charset=UTF-8");
  3. Stringparam=request.getParameter("param");
  4. //param=newString(param.getBytes("iso-8859-1"),"UTF-8");//这个用于直接处理转换get请求的编码
  5. //param=URLEncoder.encode(param);//这个是用于编码的方法
  6. param=URLDecoder.decode(param);//这个是用于解码的方法

ok ,这样子解决了js函数请求后台出现乱码的情况。


<9>另外在利用PrintWriter输出的时候 出现乱码了,具体代码如下:

  1. PrintWriterout=response.getWriter();
  2. out.print("接收的参数是:"+param);
  3. out.close();
具体效果如下所示:


这里可以在servlet请求的顶部加上response.setContentType("text/html;charset=UTF-8"); 设置内容编码格式 即可输出正确的效果,具体如下图:


综上所述:

(1)在参数的时候出现乱码,如果是get请求可以统一设置tomcat的uri编码处理格式,这样所有的url发送的请求都是以指定格式发送。

(2)request.setCharacterEncoding("UTF-8");主要用户 get/post请求中设置整个servlet的编码格式,好处是防止传递的中文参数乱码。

(3)response.setContentType("text/html;charset=UTF-8"); 主要用于指定当前请求中的内容格式,好处是防止输出内容的时候防止中文乱码。

(4)如果在处理中文乱码中以上方法都解决不了,那就要使用js前段编码两次,后台解码的方式处理。


4、是否有其他框架的配置直接解决中文乱码情况?

<1>如果项目中使用了struts2 ,可以在sturts.xml中配置一个常量,指定所有post请求的编码,具体如下:

  1. <constantname="struts.i18n.encoding"value="UTF-8"></constant>


<2>如果在项目中使用了spring,可以在web.xml中配置一个过滤器也可以解决编码乱码的问题,具体如下:

  1. <filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>encodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
分享到:
评论

相关推荐

    java web 开发 unicode 乱码解决方案

    因此,直接使用`String`对象的`getBytes`和构造方法进行转码不是可靠的解决方案。 为了解决这个问题,可以使用`URLEncoder.encode()`和`URLDecoder.decode()`,它们会按照指定的字符集进行编码和解码,避免数据丢失...

    java Web开发乱码解决方案

    ### Java Web 开发中的中文乱码问题及其解决方案 在Java Web开发过程中,中文乱码问题是一种常见的技术难题,尤其在处理客户端与服务器间的数据交互时更为突出。本文将详细介绍Java Web开发中出现乱码的原因,并...

    Java web工程乱码解决方案

    这里总结了我在j2ee开发过程中,中文乱码的解决方案。希望能够帮到大家!

    解决web项目中出现的乱码问题,很方便

    本方案提供了一个简洁有效的解决方法,通过一个Java文件和在`web.xml`配置文件中的简单设置,可以有效地解决乱码问题。 首先,我们要理解乱码产生的原因。在Web应用中,乱码通常发生在以下几个环节: 1. **请求...

    java web开发解决乱码问题

    ### Java Web 开发中解决乱码问题的全面指南 #### 一、乱码问题概述 在Java Web开发过程中,乱码问题是...此外,对于框架如Struts2等,也需要了解其特定的解决方案。希望本文能帮助大家更好地理解和解决乱码问题。

    Java中文乱码浅析及解决方案

    本文将深入探讨这一问题,并提供相应的解决方案。 首先,我们要理解Java编译器编码与运行环境编码的差异。Windows系统通常使用GBK或GB2312作为默认字符编码,而Linux系统倾向于使用UTF-8。如果Java程序在Windows...

    Java Web中文显示乱码问题的分析与解决方案.pdf

    Java Web中文显示乱码问题的分析与解决方案

    java中MySQL中文乱码问题解决方案

    Java 中 MySQL 中文乱码问题解决方案 Java 中 MySQL 中文乱码问题是数据库开发中常见的问题之一,解决这个问题需要对数据库、JSP 和 Tomcat 进行相应的设置。下面我们将详细介绍解决该问题的方案。 数据库编码修改...

    java乱码解决方案

    标题:Java乱码解决方案 描述与标签:在Java开发中,字符编码问题常常导致文本显示为乱码,尤其是在处理国际化或多语言环境时更为常见。乱码解决方案主要涉及正确设置字符编码,确保数据在输入、处理和输出过程中的...

    java项目jsp中乱码问题解决

    更推荐的解决方案是使用Filter,全局设置请求的字符编码为UTF-8。创建一个名为`SetCharacterEncodingFilter`的过滤器类,并在`web.xml`中配置,将`encoding`参数设置为"UTF8"。这样,所有的请求都会通过这个过滤器,...

    JSP乱码解决方案

    本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...

    Java Web编程中页面跳转乱码问题的解决方案.pdf

    在实际开发中,应该根据具体情况选择合适的编码和乱码解决方案,以确保Web应用的国际化和本地化兼容性。 总的来说,页面跳转乱码问题在Java Web开发中是一个常见但可以解决的问题。通过对编码机制的理解和正确的...

    解决Java_Web开发中Jsp存储读取MySQL数据中文乱码的问题

    #### 解决方案 ### 1. JSP页面显示中文乱码的问题 **问题原因**: JSP页面的编码设置不一致或未正确设置,导致浏览器在解析页面时出现乱码。 **解决步骤**: 1. **在JSP页面头部添加编码声明**: ```jsp ...

    Java乱码解决方案

    以下是一些关于Java乱码解决方案的关键知识点: 1. **字符编码基础**:首先要理解的是字符编码,如ASCII、GBK、UTF-8等。ASCII只支持英文字符,GBK是中国常用的扩展GBK编码,而UTF-8是通用的多字节编码,能支持全...

    java中文乱码解决方案

    ### Java中文乱码解决方案 #### 一、Struts2中的乱码问题及解决方案 在Java Web开发中,尤其是使用Struts2框架时,经常会遇到中文乱码的问题。这些问题的出现通常与字符编码设置不当有关。下面详细介绍几种有效的...

    web项目乱码问题 jsp乱码问题解决

    在Web开发中,尤其是涉及到Java和JSP的项目,中文乱码问题常常困扰着开发者。本文将深入探讨这个问题,提供解决方案。 首先,我们需要理解乱码的根源。乱码通常由于字符编码不一致导致,尤其是在JSP文件中,不同的...

    Java Web开发中文乱码问题的研究与解决.pdf

    在Java Web开发中,中文乱码问题是一个常见的困扰,尤其对于使用Servlet和JSP技术的开发者来说。...这需要开发者具备扎实的字符编码知识,并在实践中积累经验,以便在遇到此类问题时能迅速找到解决方案。

    做Java项目过程中遇到乱码问题的解决方案

    在做java项目(特别是web项目)的过程中,中文乱码一直是我们开发人员比较头疼的问题,因为涉及到编码,解码,字符集,以及国际化等诸多问题,所以在着手解决的时候也缺乏相关的知识。我花了一些时间自己动手实验了...

    Java Web开发(JSP、Servlet)乱码终极解决方案.txt

    本篇将详细解析如何在Java Web项目中彻底解决乱码问题,确保数据在各个环节都能正确地显示和处理。 ### 一、项目配置 #### 1. 开发工具编码设置 - **Eclipse**: 在Eclipse中,通过`Preferences -&gt; General -&gt; ...

    java中文乱码解决问题

    JAVA 中文乱码解决问题 JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的...

Global site tag (gtag.js) - Google Analytics