在JavaWeb开发的过程中,中文字符经常会出现乱码等字符集问题,一般情况下直接使用
request.setCharacterEncoding("UTF-8");
或者
request.setCharacterEncoding("GBK");
但是昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的
GET方式提交。
那为什么
GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
做了一些测试之后总结出了一点规律:
1、web浏览器对页面上通过
GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
所以,当请求的URL如下时:
http://localhost:8080/test/TestServlet?name=中国
其实真实内容是这样:
http://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串?
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
5、经过测试发现,web服务器(只测试了tomcat6)对
GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的:
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
那么如何获得正确编码的字符串?可以采用以下的方式:
String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8")
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
分享到:
相关推荐
【Java学习笔记】这篇学习笔记主要涵盖了Java开发中的一些基础操作和配置,特别是使用Eclipse作为IDE,结合Tomcat服务器进行Servlet和JSP开发时的关键点。以下是对这些知识点的详细说明: 1. **Eclipse快捷键配置**...
- `contentType`属性用于指定输出内容的MIME类型和字符编码,例如: ```jsp ;charset=utf-8" %> ``` - `import`属性用于导入类或包,例如: ```jsp ,java.text.SimpleDateFormat" %> ``` **3. `...
【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...
- `errorPage`:定义发生错误时重定向的URL。 - `isErrorPage`:标记页面是否用于处理错误。 - `isELIgnored`:控制是否忽略Expression Language(EL)。 9. **注意事项**:确保页面输出的字符集与接收请求时的...
8. **URL编码**:《对比 javascript url编码.mht》对比了JavaScript中的encodeURIComponent()、encodeURI()和escape()等函数,解释了它们在URL编码中的不同用途和限制。 9. **call函数**:《javaScript 中 call ...
### SSH框架整合知识点详解 #### 一、框架的搭建与配置 SSH框架指的是Spring、...需要注意的是,本篇笔记仅为SSH框架整合的一部分内容,完整的SSH框架还包括Spring和Hibernate的集成,涉及到更多的配置和编码工作。
- 为了防止 JSP 页面出现乱码问题,可以在 `<%@ page %>` 指令中设置正确的字符集编码,例如: - `;charset=UTF-8" %>` 以上是对 JAVA-WEB 学习笔记中的知识点进行的详细总结与解释。这些内容涵盖了从环境搭建到...
在这个"闲人笔记1"中,博主通过HelloServlet的实现,旨在帮助读者理解Servlet的基础工作原理以及开发流程。 首先,让我们深入了解一下Servlet的生命周期。Servlet生命周期包括加载、初始化、服务、销毁四个阶段。在...
### JavaWeb 学习笔记知识点总结 ...以上是对JavaWeb学习笔记中的JSP相关知识点进行了详细总结,包括JSP的基本概念、部署方式、编码设置、动态交互流程以及页面跳转等内容。希望对你学习JavaWeb有所帮助。
4. **处理数据源**:如果数据来自数据库,确保JDBC连接URL中指定正确的字符集,或者在查询语句中使用`CONVERT(COLUMN_NAME USING UTF8)`来转换编码。 5. **Java代码处理**:在Java代码中,确保读写文件、网络流等...
SpringBoot是Spring框架的一个扩展,它旨在简化Spring应用程序的开发过程,通过内嵌的Servlet容器如Tomcat或Jetty,可以快速构建出可独立运行的应用程序。在SpringBoot 2.1.6这个学习版本中,其主要特性包括: 1. *...
### 达内培训Servlet课堂笔记知识点详解 #### 一、Servlet概述 - **Servlet定义**:Servlet是一种服务器端的小程序,用于处理客户端发送来的HTTP请求,并返回相应的HTTP响应。它是Java Web开发的基础技术之一。 - ...
在Java Web开发中,`HttpServletRequest`和`HttpServletResponse`是两个非常重要...在实际应用中,结合Servlet容器,如Tomcat,`HttpServletRequest`和`HttpServletResponse`能帮助我们构建动态、交互式的Web应用程序。
这篇笔记自学资料主要涉及了Java Web开发中的核心概念,包括字符编码处理、JSP指令、JSP动作标签以及Servlet相关知识。让我们详细解析一下这些知识点。 1. 字符编码处理: 在Java Web开发中,处理字符编码是非常...
通过`@WebServlet`注解或在web.xml中配置,可以将Servlet映射到特定的URL。`service()`方法是Servlet处理请求的核心,它根据HTTP请求类型(GET、POST等)调用相应的方法。 3. **JSP与Servlet交互**: 在JSP中,...
### servlet学习笔记详解 #### Tomcat介绍 **Tomcat服务器**是基于Sun公司的JSWDK(Java Servlet and Web Development Kit)发展而来的杰出Servlet/JSP容器。作为Apache-Jakarta项目的一部分,Tomcat不仅能够执行...
<url-pattern>/myservlet</url-pattern> ``` #### 二、ServletConfig与ServletContext - **ServletConfig**:每个Servlet实例都有一个与其对应的`ServletConfig`对象,它提供了初始化参数的访问以及对Servlet...