`
麻雀咖啡
  • 浏览: 20821 次
  • 性别: Icon_minigender_1
  • 来自: 福建
文章分类
社区版块
存档分类
最新评论

【转载】jsp和Servlet中文乱码汇总

 
阅读更多
原文地址:http://blog.csdn.net/xiaolang8762400/article/details/5596397
1.jsp页面显示中文乱码:



jsp页面的编码方式有两个地方需要设置:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ page contentType="text/html;charset=utf-8"%>

其中:pageEncoding 指的是jsp文件本身在本地保存时的编码方式。contentType的charset是指服务器发送网页内容给客户端时所使用的编码。

从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:

第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效



所以最终的解决方法为:

在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。因为设置一个的话,另一个默认会和它一样。

如果两个都设置的话,必须保证两个都是支持中文编码(不一定要一样)。

最佳建议设置如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ page contentType="text/html;charset=utf-8"%>



2.           post方式传值乱码:

由于post方式传值是通过request存储的,在另一个页面也是通过request.getParameter(String name)来提取信息,所以这种情况下的乱码主要是因为request存储信息的编码设置导致的。post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。所以使用如下语句即可得到单个正确的中文字符串:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;



解决方法:

在接收页面设置request.setCharacterEncoding("UTF-8")。最好通过过滤器实现每个页面都设置为request.setCharacterEncoding("UTF-8")。



3.         get方式传值乱码:

get方式传值有两种,一种是表单get传值,另一种是url地址传值(实质上这两种方式都是通过url参数的方式传值)。



表单方式get传值:

表单方式get传值的编码过程为,首先浏览器根据页面的charset编码方式对传值进行编码,然后提交至服务器交给tomcat,tomcat对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用命令request.getParameter("")获取表单参数值时,得到的字符串,经过了charset的编码和URIEncoding的解码。

由上所知,只要charset的编码和URIEncoding的解码一致,并且支持中文,就能保证没有乱码。

设置URIEncoding的方法如下:

方法一:

修改$TOMCAT/conf/server.xml文件,在HTTP Connector或者AJP Connector的配置加上URIEncoding="gbk"

<...   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
      enableLookups="false" redirectPort="8443" acceptCount="100"
  connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk" />

方法二:

使用useBodyEncodingForURI="true". 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。

<...  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       enableLookups="false" redirectPort="8443" acceptCount="100"
      connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" />

     enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" />

在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和
useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择 字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI 则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当 useBodyEncodingForURI属性设置为true时ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/ conf/server.xml文件中找到 <Connector>标记,然后在后面加上useBodyEncodingForURI=true)

url方式get传值乱码:

于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至服务器tomcat,所以这个过程为:

首先,url地址中的中文被从gbk转换成ISO-8859-1,交给tomcat后,又被tomcat根据URLEcoding解码,这种情况,只有把URLEcoding设置为gbk才能在request.getParameter("")时不出现乱码。但是这样就会影响到上面的配置,所以一个好的解决方法是,使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。









所以一个万全的解决方法为:

1.所有页面的charset设置为UTF-8。

2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。

3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。

4. url地址中存在中文参数时,首先对中文参数使用URLEcoder编码为utf-8,然后在request.getParameter("")接收到参数后再使用URLDecoder还原。例如:

From.jsp页面:

<%String username = "张某某" ;

     username = URLEncoder.encode(username,"utf-8");

     %>

     <a href="to.jsp?param=<%=username %>">转入</a>

To.jsp页面

<%=URLDecoder.decode(request.getParameter("param"),"utf-8")%>
分享到:
评论

相关推荐

    java文件JSP文件乱码汇总

    在软件开发过程中,尤其是涉及到国际化或中文处理时,文件编码问题常导致“乱码”现象,严重影响了程序的正常运行和用户体验。本文将深入探讨Java与JSP文件乱码的问题,提供一系列解决方案,确保数据正确无误地在...

    中文乱码处理汇总.docx

    对于JSP和JDBC的MySQL乱码问题,JSP的默认请求编码是ISO8859_1,处理中文时需要将其转换为GBK。示例代码如下: ```java String str = new String(request.getParameter("name").getBytes("ISO8859-1"), "GBK"); out...

    解决jfreechart中文乱码方案整理.doc

    因此,针对JFreeChart中的中文乱码问题,本文将汇总并整理一系列有效的解决方案。 #### JFreeChart简介 JFreeChart是一款开源Java图表库,它提供了丰富的API来创建高质量的图表。JFreeChart支持多种类型的图表,...

    JSP库存管理毕业设计论文

    6. **问题解决**:讨论了中文乱码问题和其他常见问题,这些问题在开发过程中可能会遇到,需要针对性地解决。 7. **总结**:论文最后总结了已经实现的功能,如系统的核心操作,同时也列出了待完善的部分,如可能存在...

    Java Web开发项目中中文乱码解决方法汇总

    1. **JSP页面中文显示乱码** 当浏览器访问JSP页面时,如果页面内容编码与浏览器解析的编码不一致,就会出现乱码。解决方法是在JSP页面顶部添加`&lt;%@pageEncoding="utf-8"%&gt;`指令,确保页面以UTF-8编码。 2. **...

    JSP开发教程和源码收藏

    《struts框架的验证例子》和《struts2中中文乱码处理》提供了如何使用Struts进行表单验证和解决中文乱码问题的具体实践。 - **Hibernate**:Hibernate是一个强大的对象关系映射(ORM)工具,简化了Java应用程序与...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    tomcat汇总整理.doc

    Tomcat 是一个广泛使用的开源应用服务器,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨Tomcat的一些常见问题和配置信息。 首先,我们来解决浏览器GET请求中文乱码...

    答辩常见问题汇总1.pdf

    21. 数据库操作中的乱码:在存储和检索含中文的数据时,需要进行适当的编码转换,如GBK或UTF-8。 以上是对答辩常见问题的详细解答,涵盖了数据库操作、系统测试、Web应用配置、前端技术等多个IT领域的重要知识点。...

    JAVA框架面试题汇总编程资料

    ### JAVA框架面试题汇总编程资料知识点详解 #### 一、Spring MVC Framework的理解 Spring MVC 是一个基于组件技术的Web应用程序框架。在这个框架中,所有的应用对象(包括控制器、视图和业务逻辑对象)都被视为...

    软件专业答辩常见问题汇总.pdf

    - 避免乱码通常涉及设置正确的字符编码,例如在JSP页面中指定字符集,或在Servlet中设置请求和响应的编码。 这些问题的回答涵盖了软件开发的多个方面,包括数据库交互、测试策略、Web应用部署和配置、编程语言的...

    Java Web应用详解.张丽(带详细书签).pdf

    11.3 Struts 开发中的中文乱码问题 11.4 Action 数据获取与传递 11.5 Struts 表单验证 第12章 标签库及其应用 12.1 Struts标签库基础知识 12.2 Struts标签库应用实例 12.3 JSTL基础知识 12.4 EL表达式基础...

    JAVA框架面试题汇总[归类].pdf

    - SpringMVC不局限于使用JSP作为视图技术,它可以支持多种视图技术,如FreeMarker、Thymeleaf或者直接返回JSON数据。 4. **请求资源映射策略**: - SpringMVC支持多种请求资源映射策略,可以灵活地配置URL与...

    JAVA框架面试题汇总.docx

    处理 POST 请求中文乱码问题,可以在 web.xml 中配置 CharacterEncodingFilter,设置 encoding 参数为 "utf-8"。GET 请求的乱码问题可以通过修改 Tomcat 配置文件,设置 Connector 的 URIEncoding 为 "utf-8",或者...

    答辩常见问题汇总.doc

    【答辩常见问题汇总】 在答辩过程中,可能会遇到各种与项目相关的问题,这些问题涵盖了数据库连接、系统测试、网页设计等多个方面。以下是对这些知识点的详细解释: 1. **数据库连接**:通常通过Java的JDBC(Java ...

    答辩常见问题汇总1.docx

    25. **处理乱码**:可以通过设置页面字符集、设置请求编码、使用过滤器统一处理乱码问题。 这些知识点涵盖了数据库操作、Web应用开发、软件测试、前端样式控制、Java编程、服务器配置等多个方面,是CS领域常见的...

    JAVA框架面试题汇总[参照].pdf

    解决POST和GET请求中文乱码问题** - 对于POST请求,可以在web.xml配置CharacterEncodingFilter,设置字符编码为UTF-8: ```xml &lt;filter-name&gt;CharacterEncodingFilter &lt;filter-class&gt;org.springframework.web....

    软件专业答辩常见问题汇总.docx

    【软件专业答辩常见问题汇总】 在软件专业的毕业答辩中,学生常常会被问及一系列与项目开发、技术实施和理论知识相关的问题。以下是一些常见的问题及其详细解答: 1. **如何连接数据库?** - 通常,我们使用JDBC...

    java面试题广州

    2. **字符编码问题**:页面乱码和数据库乱码问题通常与字符编码设置不一致有关,解决办法是在应用和数据库中统一字符编码,例如使用UTF-8。 3. **SQL查询优化**:当查询包含重复字段时,可以使用GROUP BY语句结合...

Global site tag (gtag.js) - Google Analytics