`

tomcat 乱码问题

 
阅读更多

 

测试环境:apache-tomcat-6.0.48

操作系统:win7 中文 默认GBK编码

一、浏览器采用的字符集

测试jsp:

 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"> <!--html5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!--html4写法-->
  <title></title>
</head>
<body >
  <%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  <form action="charset.jsp">
    userName:<input type="text" name="userName" value="中国">
     <button type="submit" > 提交 </button>
  </form>
</body>

</html>
 

  页面显示正常。

   



 
 

    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
修改为===》
<%@ page contentType="text/html;charset=GBK" language="java" %>

   页面:http://127.0.0.1:8080/charset.jsp,显示乱码:

   

 查看一下IE显示页面时使用的中文编码:

是GB2312,那么IE如何确认页面采用哪一种编码格式显示页面呢?
 我们来查看一下请求响应:

 

     原来:服务器返回 Content-type:text/html;charset=GBK,

     来源于:<%@ page contentType="text/html;charset=GBK" language="java" %>,

     IE使用该字符集显示页面,charset.jsp 文件是UTF-8字符集保存的,字符集不符,所以乱码,更改

     charset.jsp 文件的字符集为GBK,再次请求,显示正常:

     


 jsp 编码取决于:<%@ page contentType="text/html;charset=GBK" language="java" %>,

那么HTML是什么情况呢? 

再测试一下:

 新建 charset.html:

 

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"> <!--html5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!--html4写法-->
  <title></title>
</head>
<body >
  <%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  <form action="charset.jsp">
    userName:<input type="text" name="userName" value="中国">
     <button type="submit" > 提交</button>
  </form>
</body>
<!--file utf-8 charset-->
</html>
 
   打开页面:http://127.0.0.1:8080/charset.html

 

   页面显示正常:

   

 查看一下服务器response header:



 Content-Type未指定字符集,那么以页面中html 标签定义的字符集为准。

  

<meta charset="utf-8"> <!--html5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!--html4写法-->
 
返过来,再想一下,如果jsp 头中未指定字符集

 

<%@ page contentType="text/html;charset=GBK" language="java" %> 

charset=GBK ------这个不写

浏览器以哪个字符集为准呢? 再测试一下:

 jsp 未指定字符集:

  

<%@ page contentType="text/html" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"> 
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title></title>
</head>
<body >
  <%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  <form action="charset.jsp">
    userName:<input type="text" name="userName" value="中国">
     <button type="submit" > 提交</button>
  </form>
</body>

</html>
 

 页面展现:

   

 页面展示正常,且浏览器认为是UTF8编码。

再看一下服务器 response header:

  

 服务器响应header 中未指定字符集, 浏览器采用html指定的字符集:

 

 <meta charset="utf-8"> 
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 


 结论:如果服务器response header 中指定了字符集:

 Content-type="text/html;charset=字符集"

           

 
则使用该字符集,如果没有指定则使用html标签中的字符集:

<meta charset="utf-8"> <!--html5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!--html4写法-->

 
 

 

 
 

 



 

二 get 请求 

 浏览器向web服务器提交请求时,如果参数中有中文,浏览器会进行转换:

    中文转换为%加上汉字字符集的编码,

如“中国”两个字:

      如果浏览器认为页面是UTF-8编码:  

                        utf-8编码占用6个字节:e4 b8 ad e5 9b bd  ,浏览器会转换为:%E4%B8%AD%E5%9B%BD

     如果浏览器认为页面是GBK编码:  

         GBK编码占4个字节:D6 D0 B9 FA,浏览器会转换为:%D6%D0%B9%FA

   

 测试jsp:

  

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"> <!--html5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!--html4写法-->
  <title></title>
</head>
<body >
  <%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  <form action="charset.jsp">
    userName:<input type="text" name="userName" value="中国">
     <button type="submit" > 提交 </button>
  </form>
</body>

</html>

  提交方式为get( form 元素中未加入 method="post"),

   

   请求url:http://127.0.0.1:8080/charset.jsp?userName=%E4%B8%AD%E5%9B%BD

   userName 值为中文“中国”,浏览器确认页面字符集编码为UTF-8(由response header 中Content-type:"text/html;charset:UTF-8"),自动为按UTF-8转码:%E4%B8%AD%E5%9B%BD,传给后台服务。

  

   提交结果后,显面显示乱码:

  

<%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  输出:userName:中国 

   原因:tomcat 默认以iso_8859_1 编码处理get请求参数。

 

   修改方式:tomcat ->conf/server.xml:

       增加:URIEncoding="UTF-8"

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

   修改后,页面显示正常:

 

     

    <%
     String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
    输出:userName:中国

   

   问题:如果页面编码格式为GBK,那么会不会乱码呢?

   修改:

   

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
修改为===》
<%@ page contentType="text/html;charset=GBK" language="java" %>

 

 那么提交一下,显示乱码:

  

 原因: 页面字符集为GBK,向后台提交请求时采用GBK编码,向后台传送%D6%D0%B9%FA,后台tomcat配置为URIEncoding="UTF-8",以UTF-8编码接收请求的GBK编码的数据,所以乱码。 

 

 

总结:对于get请求时参数中有中文,后台需要配置:

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443"   URIEncoding="字符集"/>

 字符集取决为:

   jsp:

<%@ page contentType="text/html;charset=这个字符集" language="java" %>

 

    html: 

   <meta charset="这个字符集"> 

<meta http-equiv="Content-Type" content="text/html; charset=这个字符集" />     

   

 

三、post请求

 

   与get请求一样,浏览器对当前页面的采用的字符编码进行汉字编码,发送给后台。

   区别在于:汉字编码是在 body中发送出的,而不是在请求的queryString中发出去的。

   所以对post请求,server.xml中配置URIEncoding="字符集"不启做用,需要程序中调用:

            request.setCharacterEncoding("字符集")。

 

   该字符集与浏览器发送的编码一至即可。

   request.setCharacterEncoding:spring 提供了一个通用的filter可以设置:

    

 
<filter>  
	 <filter-name>EncodingFilter</filter-name>  
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter  
	 </filter-class>  
	 <init-param>  
		<param-name>encoding</param-name>  
	 <param-value>UTF-8</param-value>  
	 </init-param>  
	 <init-param>  
	 <param-name>forceEncoding</param-name>  
		<param-value>true</param-value>  
	 </init-param>  
 </filter>  
<filter-mapping>  
     <filter-name>EncodingFilter</filter-name>  
     <url-pattern>/*</url-pattern>  
</filter-mapping>  
</web-app>

 需要注意:EncodingFilter 应该是第一个被调用的filter,原因:如果其它Filter 从request获取了数据,如request.getParameter 之后,EncodingFilter再设置:request.setCharacterEncoding 不生效。

  因此EncodingFilter 应该在web.xml 中最靠前的位置。

 

 

    测试jsp:

    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"> <!--HTML5写法-->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!--HTML4写法-->
  <title></title>
</head>
<body >
  <%
    String userName = request.getParameter("userName");
    out.println("userName:"+userName);
  %>
  <form action="charset1.jsp" method="post">
    userName:<input type="text" name="userName" value="中国">
     <button type="submit" > 提交</button>
  </form>
</body>
<!--file charset:UTF-8 -->
</html>

  由jsp可见,浏览器会使用utf-8编码汉字,因此tomcat web.xml :filter 字符集设为UTF-8

  

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.    
  7. <filter>  
  8. <filter-name>EncodingFilter</filter-name>  
  9. <filter-class>org.springframework.web.filter.CharacterEncodingFilter  
  10. </filter-class>  
  11. <init-param>  
  12. <param-name>encoding</param-name>  
  13. <param-value>UTF-8</param-value>  
  14. </init-param>  
  15. <init-param>  
  16. <param-name>forceEncoding</param-name>  
  17. <param-value>true</param-value>  
  18. </init-param>  
  19.  </filter>  
  20. <filter-mapping>  
  21.      <filter-name>EncodingFilter</filter-name>  
  22.      <url-pattern>/*</url-pattern>  
  23. </filter-mapping>  
  24. </web-app>
  25. </web-app>  

 

打开页面,显示正常,提交中文正常:



 

 

   

 




 
 

   

 

  • 大小: 2.6 KB
  • 大小: 6.1 KB
  • 大小: 26 KB
  • 大小: 58.5 KB
  • 大小: 37 KB
  • 大小: 26.1 KB
  • 大小: 5.6 KB
  • 大小: 52.7 KB
  • 大小: 5.4 KB
  • 大小: 11.6 KB
  • 大小: 4.2 KB
  • 大小: 11.6 KB
  • 大小: 4.2 KB
  • 大小: 27.7 KB
分享到:
评论

相关推荐

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    Tomcat乱码问题

    ### Tomcat乱码问题及其终极解决方案 在使用Tomcat服务器部署Web应用时,字符编码问题时常困扰着开发者,尤其是在处理中文或特殊字符时,页面显示出现乱码是常见的现象。本文将深入探讨Tomcat乱码问题的原因,并...

    TOMCAT乱码问题

    TOMCAT乱码问题解决方法 TOMCAT乱码问题是jsp网页制作与开发中常见的问题。造成乱码的原因是tomcat对表单提交和GET请求的处理方式不同。Tomcat4和Tomcat5处理乱码的方法不同,在Tomcat5中,需要使用Filter设置字符...

    解决tomcat中文乱码问题

    解决tomcat中文乱码问题,有详细的解释说明,希望对需要的人有所帮助

    idea tomcat乱码问题的解决及相关设置的步骤

    "Idea Tomcat 乱码问题的解决及相关设置的步骤" 本文主要介绍了 Idea Tomcat 乱码问题的解决及相关设置的步骤,通过详细的示例代码,帮助读者了解 Idea Tomcat 乱码问题的解决方法和相关设置的步骤。 一、 Idea ...

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题.docx

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题 在 Ubuntu 操作系统下使用 Tomcat 搭建网站时,可能会出现中文乱码的问题。这是由于字符集的不统一所致。为了解决这个问题,需要统一服务器的字符编码,包括 Linux ...

    Docker容器部署tomcat出现中文乱码.docx

    因此,在 Docker 容器中部署 Tomcat 时,中文字符将无法正确显示,导致乱码问题。 解决方案 要解决这个问题,我们可以在 Dockerfile 中添加环境变量,设置 locale 为 en_US.UTF-8。这将使 Docker 容器支持 UTF-8 ...

    解决Tomcat中文乱码

    ### 解决Tomcat中文乱码问题 在使用Tomcat服务器部署Web应用时,经常会遇到中文乱码的问题。本文将详细探讨这一现象的原因,并提供一种有效的解决方案。 #### 问题背景 在Tomcat环境下运行Web应用程序时,如果...

    tomcat显示出现中文乱码问题.docx

    本文将详细介绍如何解决Tomcat中的中文乱码问题。 首先,我们需要理解Tomcat的字符编码处理流程。Tomcat在接收HTTP请求时,会根据`Connector`元素的`useBodyEncodingForURI`属性和`URIEncoding`属性来确定请求参数...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...

    关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论

    标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...

    解决tomcat中文乱码问题.doc

    ### 解决Tomcat中文乱码问题 在使用Tomcat服务器部署Web应用时,经常会遇到中文乱码的问题。本文将详细探讨几种常见的乱码场景及其解决方案。 #### 一、JSP页面上的中文显示为乱码 **问题描述**:在JSP页面中直接...

    tomcat 下catalina.out 日志乱码问题处理

    标题中的“tomcat下catalina.out日志乱码问题处理”主要涉及的是在Tomcat服务器运行过程中,输出的日志文件`catalina.out`中,中文字符显示为乱码的状况。这通常是由于字符编码不匹配导致的,因为Tomcat在读取或写入...

    如何解决Tomcat下中文乱码问题?

    在IT行业中,尤其是在Java Web开发领域,Tomcat服务器在处理中文字符时经常遇到乱码问题。这主要涉及两个方面:JSP页面显示中文乱码和表单提交乱码。为了解决这些问题,我们需要理解字符编码的基本原理,并采取相应...

    解决tomcat下中文乱码问题

    解决 Tomcat 下中文乱码问题 在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符...

    IDEA中Tomcat乱码问题

    通过以上步骤,你应该能够解决IDEA中Tomcat的乱码问题。确保每个环节都按照正确顺序进行,以确保所有输出都正确地使用UTF-8编码。如果问题仍然存在,可能需要检查其他可能导致编码问题的设置,例如系统的区域和语言...

    tomcat值乱码解决

    最近几个项目,都出现了乱码问题。某些通过URL来传送、值为汉字的参数,在页面中显示的是乱码,但是在本地开发环境是正常显示的。排除的因素当然就是服务器的设置不当了,但具体是那些原因呢?一般我们所装的linux...

    springboot乱码问题解决方案

    在SpringBoot项目中,默认情况下,Tomcat服务器使用ISO-8859-1字符编码,而开发者通常使用UTF-8字符编码,导致乱码问题的出现。 二、解决方案 1. 配置文件中添加编码设置 在application.properties或application....

Global site tag (gtag.js) - Google Analytics