`

JSP乱码问题

    博客分类:
  • java
 
阅读更多

[size=large][/size]http://panqunjun.blogcn.com/articles/jsp%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98-%e5%8e%9f.html


这个问题实在是JSP开发的经典!看到很多人为之困惑。
网上搜索到了很多文章,我看多不怎么正确的,因为Tomcat4和Tomcat5是不一样的。
这里我使用的是apache-tomcat-5.5.25。



乱码有三点:
1)文件流:读JSP文件,生成Servlet文件。
2)socket流:Servlet运行后,在缓存中的字符串的编码,也就是contentType编码。
3)request.getParameter()是乱码,这个是最复杂的!



执行过程:.jsp -> .java -> buffer -> flush buffer



1)文件流
.jsp -> .java
.jsp文件本身有一个文件编码格式。
然后,JSP的<%@page%>标签可以设置contentType和pageEncoding,
对应的.java设置是response.setContentType,pageEncoding可以不用写,
如果pageEncoding写的话,在将.jsp转化为.java时,是按照该编码进行解码的。
(默认情况下,contenType = null,encoding = ISO-8859-1)
response设置这个主要是最终以该编码格式的字符串写给客户端的浏览器接收到以后,
客户端浏览器会根据HTTP头部“Content-Type”自动调整浏览器的编码类型,
然后才能被正确显示。
容器在将JSP页面转化为.java代码的时候,是按照contentType和pageEncoding的信息
进行对JSP文件的解码,然后按照特定的逻辑生成的.java文件(.java文件是按照UTF-8编码的)。



所以,.jsp文件本身和它的contentType和pageEncoding编码一定要一致,否则生成的
.java文件里面就可能有乱码。
在eclipse中,根据contentType信息会自动智能的进行调整。
如果用记事本编写的话,就有可能出乱码了。



2)socket流
.java -> buffer
运行.java代码,在内存中会有一个buffer,这个buffer理解为字符串。
然后,这个buffer是通过contentType和pageEncoding的编码格式进行编码的,
这样就保证了发给客户的字符串buffer和Content-Type的编码头部是一致的。



buffer -> flush buffer
最后,服务器从内存中将字符串刷新给客户了。



3)request.getParameter()是乱码
其实,这个很简单,只是Tomcat4和Tomcat5处理是不一样的。
Tomcat4,我没有用过,但是,看了一些文章后,也让我知道是什么个意思了。
是说,Tomcat4处理get和post是一样的,默认是用iso-8859-1解码的。
所以,很多人说用Filter来设置request的编码就可以解决问题了。
而Tomcat5对get和post处理是分开了,可以说这样一来,Tomcat5的处理方法更加细致了,
它已经包含了Tomcat4的功能,但是,对我们开发人员来说,这个角落里面的一个小细节的变动
会造成很多人犯错误的。



下面一组测试,使用apache-tomcat-5.5.25测试。
   req.getParameter("name") 提交格式
get   ?(乱码    按照contentType设置的编码,每个字节用%分隔。
post   ?    同上
URL中输入中文  ?    系统默认编码



怎么才能得到中文?
get: URLEncode  先用iso-8859-1编码回去,再用contentType解码。
post: URLEncode  同上
URL: 中文  先用iso-8859-1编码回去,再用系统编码解码。



问题出在哪里?
就是客户端浏览器在做get和post提交数据的时候,浏览器是按照contentType设置编码的,每个字节用%分隔。
提交到Tomcat后,Tomcat使用iso-8859-1进行解码的,所以得到肯定是乱码。
比如,我们经常是这样处理的:
String name = req.getParameter("name");
name = new String(name.getBytes("iso-8859-1"), "utf-8"); // 先编码回去,再用utf-8解码的。



那么有没有一种能够让大家满意的解决方案呢?
当然是有的。
找到Tomcat的server.xml
然后,设置
<Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"
               URIEncoding="utf-8" useBodyEncodingForURI="true" />
解释一下:
URIEncoding="utf-8":是指定义对客户端浏览器的get请求中URI的解码。
问题是,如果只是设置了URIEncoding而没有设置useBodyEncodingForURI的话,那么只能保证get请求是可以正常
显示的。
因为,Tomcat5处理get是用URIEncoding设置的,处理post是通过设置request.setCharacterEncoding()和
useBodyEncodingForURI="true"实现的。



useBodyEncodingForURI="true":这个是和Tomcat4保持兼容用的,默认为false。
设置为true的话,就可以用过滤器进行设置request.setCharacterEncoding()编码来统一处理get和post了。




小结:
1)保证生成的Servlet代码正确。
必须保证.jsp文件和contentType和pageEncoding编码格式一致。



2)保证Servlet输出的编码正确。
必须保证.java文件里面设置的编码response.setContentType是正确的。



3)保证request.getParameter()正确。
通过设置useBodyEncodingForURI="true",再使用一个Filter设置request.setCharacterEncoding()编码。




举个例子:
修改server.xml:useBodyEncodingForURI="true"保持Tomcat4的风格(URIEncoding="utf-8"不需要的)



sample.jsp:<%@ page language="java" contentType="text/html; charset=utf-8"%>
sample.jsp本身是用UTF-8编码的,这个用eclipse是自动的。



CharsetFilter.java:设置request.setCharacterEncoding("utf-8");


SampleServlet.java:如果要输出中文的话,记得在得到PrintWriter之前,
先“resp.setContentType("text/html;charset=utf-8");”,然后,在输出。

 

分享到:
评论

相关推荐

    Jsp乱码问题解决

    ### JSP乱码问题解决 #### 一、JSP页面显示乱码 在JSP页面开发过程中,中文乱码是一个常见的问题。这个问题主要是由于服务器端和客户端(浏览器)的编码设置不一致导致的。 **原因分析:** 1. **服务器编码设置...

    Jsp乱码问题解决2

    ### JSP乱码问题及其解决方案 #### 一、最基本的乱码问题 JSP页面中出现乱码最常见的原因是页面编码不一致。例如,在JSP页面中设置了多种不同的编码格式,这会导致浏览器无法正确解析中文字符,从而显示为乱码。...

    JSP乱码问题相关的一些集锦

    ### JSP乱码问题及其解决方法 在进行Web开发时,尤其是使用JSP技术栈时,经常遇到的一个问题是页面出现乱码。这类问题虽然看似简单,但若处理不当,则会严重影响用户体验。本文将针对JSP乱码问题进行深入探讨,并...

    jsp乱码问题

    ### JSP乱码问题解析与解决方案 在Java Server Pages(JSP)开发中,乱码问题是一个常见的技术挑战,尤其当涉及到多语言环境或特定字符集的处理时。本文将深入探讨JSP乱码问题的成因,并提供一系列实用的解决策略。...

    JSP乱码问题的解决.doc

    ### JSP乱码问题的全面解析与解决方案 #### 一、JSP页面显示乱码的成因与对策 在JSP开发中,页面显示乱码是开发者常常遭遇的难题之一,尤其是在处理中文字符时。这一问题的根本原因在于服务器端与客户端(浏览器)...

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

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

    jsp编码 jsp乱码

    jsp乱码问题是jsp开发中常见的问题之一,该问题可能会导致jsp页面显示乱码,影响用户体验。解决jsp乱码问题的方法有多种,以下是一些常见的解决方案: 1. 设置pageEncoding参数 设置pageEncoding参数可以解决jsp...

    JSP乱码解决方案

    解决JSP乱码问题,关键在于确保所有环节的字符集设置一致,从JSP文件、HTTP响应头、服务器配置、IDE、数据库到文件操作,都要注意编码和解码的一致性。通过以上方法,可以有效地预防和解决JSP页面的乱码问题,提供更...

    Servlet、Jsp乱码问题(三)

    本文将深入探讨Servlet和JSP中的乱码问题及其解决方法。 首先,我们需要理解字符编码的基础知识。在计算机中,字符编码是用来表示文本的方式,常见的有ASCII、GBK、UTF-8等。不同的编码格式可能导致相同字符的二...

    jsp乱码的3种解决方法

    总之,解决JSP乱码问题需要从多个角度出发,包括但不限于页面编码、请求参数、文件上传和响应内容。通过细致地检查和调整这些环节,通常能够避免乱码的出现,确保数据在传递过程中始终保持清晰可读。在实际开发中,...

    jsp页面乱码处理

    本文将根据“jsp页面乱码处理”的标题与描述,深入解析解决JSP乱码问题的策略,并结合具体代码实例,帮助开发者彻底摆脱这一难题。 #### JSP乱码的根本原因 JSP页面的乱码通常源自字符编码不一致,即不同环节使用...

    jsp乱码解决超酷,通过web.xml配置

    综上所述,解决JSP乱码问题的关键在于统一各个阶段的字符集,包括HTTP请求、JSP页面、Servlet响应和数据库交互。通过`web.xml`的配置,我们可以实现全局的字符集控制,使得整个应用对非ASCII字符的处理更加顺畅。...

    解决JSP中文乱码问题

    解决 JSP 中文乱码问题 解决 JSP 中文乱码问题是一个很常见的问题,在 JSP 开发过程中,经常出现中文乱码的问题,可能一至困扰着大家。下面我们将详细讨论 JSP 中文乱码问题的成因和解决方法。 JSP 中文乱码问题的...

    Jsp乱码解决方案 word文档

    JSP乱码问题主要由字符编码不一致引起,通过统一和正确地设置各个环节的编码,可以有效避免这类问题。对于具体的项目,需要根据实际情况分析乱码产生的环节,并针对性地调整相关配置。提供的解决方案涵盖了常见的...

    jsp中文乱码的解决方案

    文档《JSP各种乱码的处理(一).doc》和《JSP各种乱码的处理(二).doc》中可能详细列举了各种JSP乱码问题的实例及解决方法,包括但不限于文件上传、读取流、数据库操作等方面,建议参考学习,以便更全面地理解并解决...

    jsp乱码jsp乱码jsp乱码

    jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题jsp乱码jsp乱码问题...

    jsp乱码解决方法.txt

    ### JSP乱码问题及其解决方法 #### 一、引言 在进行Java Web开发时,经常遇到的一个问题是页面字符编码出现乱码的情况。虽然这看似是一个小问题,但如果处理不当,会对用户体验甚至整个项目的质量产生严重影响。...

Global site tag (gtag.js) - Google Analytics