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

jsp 编码问题

阅读更多
  使用Tomcat进行JSP开发最头疼的莫过于中文乱码问题了,总结Tomcat乱码问题出现的原因必须明白以下几点:



1.Tomcat一般总是默认使用ISO-8859-1作为字符编码方式的。所以,除非你在Servlet中使用了request.setCharacterEncoding("编码方式");指定了特殊的编码方式,否则Tomcat默认使用ISO-8859-1的编码方式。



2.在JSP页面中pageEncoding和charset和含义是不同的。pageEncoding是指页面的编码格式(请记住!,十分重要~,与显示无关),也就是说无论你JSP里的pageEncoding采用什么方式,如果出现中文乱码,原因不在于pageEncoding的所指定的编码方式不对,而在于charset的属性不对。charset是负责JSP页面中的字符按什么编码方式显示。pageEncoding只负责页面的编码格式,而后JAVA虚拟机负责按照pageEncoding指定的编码转换成Unicode编码的字节码文件。(也就是说,无论你pageEncoding指定什么方式,最终都是转换成了Unicode编码。)另外请大家注意,如果从客户端提交的用户请求里的中文也是使用pageEncoding方式编码的。也就是说,在Servlet中request.getParameter("参数");Tomcat默认是使用ISO-8859-1方式去读取的,但实际里面的字符编码方式应该是JSP页面pageEncoding所指定的方式。除非用户自己加上request.setCharacterEncoding("编码方式");



3.明白pageEncoding和charset之间的关系。一般而言,如果页面里指定了pageEncoding的方式也就是说,比如:<%@ page language="java" import="java.util.*" pageEncoding="GBK" %>这句话,而没有指定charset的话,那么页面默认是按照charset=ISO-8859-1编码方式显示字符,按照pageEncoding="GBK"方式进行页面的编码。如果你的JSP页面里面没有指定pageEncoding方式,而只是说明了charset的话,比如:

<%@ page contentType="text/html;charset=utf-8"%> 这句话,那么JSP默认是按照pageEncoding="utf-8"进行页面编码的,字符集按照charset=utf-8"显示。



4.使用request.setCharacterEncoding("编码方式");注意:request.setCharacterEncoding()仅仅对POST提交方式起作用,对于GET方式提交还是会出现乱码问题。要解决GET提交中文的乱码问题,可以在Server.xml 的<Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

加入:URIEncoding="utf-8" useBodyEncodingForURI="true"

另外,request.setCharacterEncoding()这句话一定要放在要读取的第一参数之前调用。否则也不起作用了!!



下来我们看一个小例子:

  在index.jsp页面中,指定pageEncoding方式:

------------------------------------------------------------------

<%@ page language="java" import="java.util.*" pageEncoding="GBK" %>

<html>
  <head>
    <base href="<%=basePath%>">
  
    <title>My JSP 'index.jsp' starting page</title>
  
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">  
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

  </head>

  <body>
     <form action=servlet/Login method=post>
       用户名:<input type=text name="username" size=20><br>
       密码:<input type="password" name="password" size=20><br>
       <input type=submit name="submit">
   </form>
  </body>
</html>
-------------------------------------------------------------

在Login.java Servlet源文件中:

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

 
  PrintWriter out = response.getWriter();
  out.print("<H>welcome you come here!</H>");
  out.print("<br>");
  out.println(request.getParameter("username"));
  out.print("<br>");
  out.println(request.getParameter("password"));
  out.print("<br>");
  out.flush();
  System.out.println(response.getCharacterEncoding());
  out.close();
}

当输入中文的用户名,调用Login Servlet后,结果能正常显示中文,读者看到这里似乎感到很奇怪。

因为,在Login Servlet中并没有使用request.setCharacterEncoding("编码方式");指定特点的编码方式,也就是说Tomcat默认是使用ISO-8859-1的方式,怎么能正常显示中文了呢?问题出在IE浏览器上,请大家注意!因为,大家默认使用的都是中文IE浏览器,所以中文IE浏览器默认使用的字符集是charset=GBK,再请大家注意了,在上面这段Login Servlet 代码中并没有指定response.setContentType("text/html;charset=GBK");这样的语句,也就是说IE浏览器认为,既然用户自己没有指定字符集,那么就使用默认的字符集,也就是默认使用了charset=GBK,

所以你所看到的中文显示,是IE浏览器默默帮你转换了,从ISO-8859-1到GBK的转换,也就是说IE浏览器帮你做了这么一句话:

out.println(new String(request.getParameter("username").getBytes("ISO-8859-1"),"gbk"));

再请大家注意,如果你在Login Servlet 原码中加入了response.setContentType("text/html;charset=GBK");那么你就画蛇添足了,反而起到不好的效果,因为IE浏览器认为用户自己已经指定了特定的字符集方式,而且就是charset=GBK方式,所以就不需要从ISO-8859-1到GBK的转换,因为IE浏览认为你页面里的字符就应该是GBK编码方式的,但是其实不然,是ISO-8859-1方式的,所以反而显示的中文乱码了。



下来,我们把上面的小例子改一下:index.jsp页面中只指定charset方式:

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

<html>
  <head>
    <base href="<%=basePath%>">
  
    <title>My JSP 'index.jsp' starting page</title>
  
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">  
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

  </head>

  <body>
     <form action=servlet/Login method=post>
       用户名:<input type=text name="username" size=20><br>
       密码:<input type="password" name="password" size=20><br>
       <input type=submit name="submit">
   </form>
  </body>
</html>
-------------------------------------------------------

在Login.java Servlet源文件中:

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("text/html;charset=utf-8");

  //response.setContentType("text/html;charset=GBK");//也可以正常显示中文

  request.setCharacterEncoding("utf-8");
  PrintWriter out = response.getWriter();
  out.print("<H>welcome you come here!</H>");
  out.print("<br>");
  out.println(request.getParameter("username"));
  out.print("<br>");
  out.println(request.getParameter("password"));
  out.print("<br>");
  out.flush();
  System.out.println(response.getCharacterEncoding());
  out.close();
}



因为在index.jsp中

<%@ page contentType="text/html;charset=utf-8"%>有这句话,所以JSP默认使用的pageEncoding=utf-8

所以在Login Servlet你必须加上:

response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");
这两句话,才能正常显示中文!

好了,关于Tomcat中文乱码问题就总结到这里!总之,出了问题只要明白Tomcat的工作原理,并从以上三个注意点出发分析,总能找到问题的答案。
说明:来源于http://blog.sina.com.cn/s/blog_5396eb530100cg44.html
分享到:
评论

相关推荐

    Jsp乱码问题解决

    ### JSP乱码问题解决 ...总结起来,解决JSP中的中文乱码问题主要需要关注三个方面:页面编码设置、表单提交数据编码设置以及数据库连接和字段编码设置。通过合理配置这些参数,可以有效避免乱码问题的发生。

    jsp编码 jsp乱码

    jsp编码乱码问题是jsp开发中常见的问题之一,该问题可能会导致jsp页面显示乱码,影响用户体验。因此,了解jsp编码的原理和解决乱码问题的方法是非常重要的。 jsp编码的原理 jsp编码是指jsp页面中的编码方式,jsp...

    JSP乱码问题

    JSP乱码问题是指在JSP页面中遇到的字符编码问题,导致页面显示乱码的现象。下面是解决JSP乱码问题的一些常见方法: 首先,在JSP页面中,我们可以使用String的getBytes()方法将字符串转换为指定编码的字节数组,然后...

    Jsp乱码问题解决2

    ### JSP乱码问题及其解决方案 #### 一、最基本的乱码问题 ...总之,解决JSP乱码问题的关键在于确保各个环节的编码一致性,并采取相应的编码转换措施。通过上述方法,可以有效地解决常见的JSP乱码问题。

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

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

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

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

    jsp乱码问题

    ### JSP乱码问题解析与解决方案 在Java Server Pages(JSP)开发中...总之,解决JSP乱码问题的关键在于确保所有涉及字符编码的地方保持一致性和正确性。通过以上措施,开发者可以构建出更加稳定、兼容性强的Web应用。

    JSP乱码问题的解决.doc

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

    解决JSP中文乱码问题

    解决 JSP 中文乱码问题 解决 JSP 中文乱码问题是一个很常见...解决 JSP 中文乱码问题需要从多方面入手,包括在 JSP 文件中指定编码方式,在 Java 文件中指定编码方式,在页面中指定编码方式,并确保编码方式的一致性。

    JSP编码以及乱码问题解疑

    **JSP编码与乱码问题详解** 在JSP(JavaServer Pages)开发中,编码问题是一个常见的困扰,尤其是在处理中文字符时。本文将深入探讨JSP编程过程中出现的乱码问题,包括原因分析和解决方案。 1. **基本的乱码问题**...

    JSP乱码解决方案

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

    Servlet、Jsp乱码问题(三)

    总结起来,解决Servlet和JSP中的乱码问题,关键在于正确设置请求和响应的字符编码,并确保整个开发环境和部署环境的一致性。对于复杂的项目,使用过滤器可以提供更统一和灵活的解决方案。通过理解字符编码的基本原理...

    jsp乱码的3种解决方法

    JSP页面的编码设置是解决乱码问题的基础。在JSP文件的顶部,使用`&lt;%@ page&gt;`指令设置页面编码。例如: ```jsp ;charset=UTF-8" language="java" %&gt; ``` 这里的`contentType`属性定义了页面的MIME类型(这里是`text...

    jsp中文乱码问题jsp中文乱码问题详解

    jsp中文乱码问题的出现是由于编码格式不一致所导致的,可以通过确保jsp文件的存储格式、解码格式和控制浏览器的解码方式一致来解决乱码问题。同时,在使用Post和Get方式提交表单时,需要指定提交的编码格式,以避免...

    JSP中文乱码问题解决办法

    JSP 中文乱码问题解决办法 JSP 页面中中文乱码问题是指在 JSP 页面中使用中文时,页面显示...解决 JSP 中文乱码问题需要从多方面入手,包括设置页面的字符编码、使用 POST 方式提交表单、使用 GET 方式提交表单等。

    jsp页面乱码处理

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

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

    "jsp乱码解决超酷,通过web.xml配置"这个标题表明,我们将通过配置`web.xml`文件来解决JSP页面中的乱码问题。下面将详细介绍这个过程以及相关的知识点。 首先,我们需要理解JSP乱码产生的原因。当用户通过表单提交...

    Jsp乱码解决方案 word文档

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

    jsp中文乱码的解决方案

    总之,解决JSP中文乱码问题的关键在于确保所有环节的编码设置一致,并使用支持中文的编码格式,如UTF-8。通过以上步骤,大部分乱码问题都能得到妥善解决。在实际开发过程中,还需结合具体情况进行调整,以确保数据的...

Global site tag (gtag.js) - Google Analytics