`

Jsp页面中的字符编码方式与乱码解决方案

阅读更多

JSP/Servlet中的编码方式

在JSP/Servlet中主要有以下几个地方可以设置编码,

  • pageEncoding="UTF-8"
  • contentType="text/html;charset=UTF-8"
  • request.setCharacterEncoding("UTF-8")
  • response.setCharacterEncoding("UTF-8")

其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet中。

1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet原代码文件时所使用的编码
JSP在服务器上是要先被编译成Servlet的类文件的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet为文件时使用的编码。通常,在JSP内部定义(指在 <%%>块内定义的)的字符串或直接作为HTML输出(指直接在jsp文件中输写的HTML中文内容)的字符串出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以UTF-8为编码保存的(在eclipse选中jsp文件,右键点属性就可以更改保存该jsp的编码方式),而在JSP中却指定pageEncoding="GBK"(或不指定时使用操作系统默认的编码方式,即也为GBK),就会引起JSP内部定义的字符串为乱码,这时当我们用文本编辑打开tomcat生成的jsp所对应的servlet类文件时,我们发现就是乱码。


另外,该参数还有一个功能,就是在JSP中不指定contentType属性,也不使用response.setCharacterEncoding方法指定编码方式时,服务器响应的编码方式以及浏览器的编程方式(IE中可以通过菜单“查看-->编码”来看查浏览目前的编码方式)就是此时pageEncoding指定的编码方式。


2、contentType="text/html;charset=UTF-8"的作用是指定服务器响应(response)的编码方式
在不使用response.setCharacterEncoding方法时,用该参数指定服务器响应所使用的编码方式。服务器在将数据发送到浏览器前,对数据以指定的编码方式进行编码,使用的就是该编码方式。


3、request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行编码的方式
该方法用来指定对浏览器发送来的数据进行编码的编码方式。


4、response.setCharacterEncoding("UTF-8")的作用是指定服务器响应的编码方式
服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

 

浏览器接收与发送数据的编码方式

其次,要说一说浏览器是怎么样对接收和发送的数据进行编码的
response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行编码的编码方式。同时,浏览器也是根据这个参数来对其接收到的数据进行编码。所以在无论你在JSP中设置response.setCharacterEncoding("UTF-8")或者response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding参数等)。下面做个测试,在JSP中设置response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择“查看(V)-->编码(D)”中可以查看到是“Unicode(UTF-8)”,而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面时,在IE的菜单中选择“查看(V)-->编码(D)”中可以查看到是“简体中文(GB2312)”。

 

浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使用response.setCharacterEncoding参数来进行URL编码的。以baidu和google为例,如果你在baidu中搜索“汉字”,百度会将其编码为“%BA%BA%D7%D6”(百度主页面表单是以get方式请求的,提交时浏览器会自动对搜索框中的值采用页面编码,然后把编码转换成%xx形式串,并放在HTTP请求头中传送到服务器,编码转换后内容还会显示在地址栏中)。而在google中搜索“汉字”,GOOGLE会将其编码为“%E6%B1%89%E5%AD%97”(以前可以,现在好像直接显示了),这是因为baidu的response.setCharacterEncoding参数为GBK,而google的response.setCharacterEncoding参数为UTF-8。

浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和pageEncoding参数),我们称其为浏览器编码。 当然,在IE中可以修改浏览器编码(在IE的菜单中选择“查看(V)-->编码(D)”中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在IE中浏览goole的主页时,将浏览器编码修改为“简体中文(GB2312)”,此时,页面上的中文会变成乱码,不理它,在文本框中输入“汉字”,提交,GOOGLE会将其编码为“%BA%BA%D7%D6”,可见,浏览器在发往服务器前,对参数内容进行URL编码时,使用的就是浏览器编码

服务器接收与发送数据的编码方式

我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。
对于发送数据,服务器按照response.setCharacterEncoding-->contentType-->pageEncoding的优先顺序,对要发送的数据进行编码


对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。


因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。
无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。

对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行的编码设置成浏览器编码,就可以保证得到的参数编码正确。那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的response.setCharacterEncoding设置成相同的值即可。

 

对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行编码,而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码。 要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者URIEncoding属性,其中useBodyEncodingForURI 参数表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为true);URIEncoding 参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一编码的方式。URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的编码,会影响所有的Web应用,而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码,不同的页面可以有不同的编码方式。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面或Servlet中request.setCharacterEncoding参数设置成浏览器编码后,再获取参数值

 

总结

以Tomcat5.0为WEB服务器时,如何防止中文乱码。
1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。
2、正确设置JSP的pageEncoding参数
3、在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
4、对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐) <Connector port="8080" ... URIEncoding="UTF-8" useBodyEncodingForURI="true" />。

分享到:
评论
1 楼 spiritfrog 2010-08-26  
对于get方式, 字符编码是由浏览器决定的,根据浏览器不一样会各有不同;
post方式,字符编码由contentType="text/html;charset=UTF-8"或者pageencoding 来决定。

相关推荐

    JSP乱码解决方案

    JSP乱码通常发生在字符编码不一致或者处理不当的情况下,这会影响用户界面的显示,导致文字显示为不可读的方块或者特殊字符。本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP...

    jsp乱码解决方案 本方案解决了jsp常见的乱码问题

    ### jsp乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,字符编码问题是一个经常遇到的技术难题。如果处理不当,很容易导致网页显示乱码,影响用户体验及数据的正确性。...

    字符集和乱码解决方案

    在Java中,乱码问题是常见的问题之一,本文将讨论字符集和乱码解决方案,帮助开发者解决乱码问题。 字符集简介 字符集是计算机中用于表示文本的编码方式,它定义了如何将文本转换为二进制代码。常见的字符集有ISO...

    JSP动态网站设计中的中文乱码解决方案

    ### JSP动态网站设计中的中文乱码解决方案 #### 一、引言 随着互联网技术的发展,JSP(Java Server Pages)作为一种重要的动态网页技术,在构建交互式网站方面扮演着重要角色。然而,在实际开发过程中,中文乱码...

    jsp页面传值中文乱码问题处理.docx

    在 JSP 页面中传值时,中文字符可能会出现乱码问题,这是由于字符编码不一致所引起的。下面将详细讲解 JSP 中文乱码种类和解决方案。 JSP 文件中文内容显示乱码 在 JSP 文件中,如果中文内容显示乱码,可能是由于...

    几种常用解决jsp中文乱码的方案

    JSP 采用 ISO-8859-1 作为默认的页面字符编码,这是一种定长单字节字符集,适用于拉丁语,但不能识别中文。解决办法是,在网页代码中,加载页面指令 `; charset=gb2312" language="java" %&gt;`,规定了 JSP 按其后指定...

    Eclipse 开发JSP中文乱码解决方案

    这确保了项目内的所有文本文件(包括JSP文件)以正确的编码方式打开和保存。 2. **Window -&gt; Preferences -&gt; Workspace** 这一步是为了全局配置Eclipse的工作空间设置。同样地,找到“Text file encoding”选项,...

    解决jsp页面中文乱码问题

    在Web环境中,HTTP协议和HTML文档都有自己的默认字符编码,而JSP页面作为动态内容生成者,其编码设置更为关键。 1. **JSP页面编码设置** JSP页面默认的编码可能与我们的实际需求不符,特别是在处理中文字符时。...

    JSP与MySQL交互的中文乱码解决方案

    确保项目的默认编码方式与数据库和JSP页面保持一致,可以在项目属性中设置默认的文本文件编码为GBK。 4. **SQL语句中的字符集指定**: - 在查询语句中,可以使用`_charset`语法转换字符串的字符集,例如`_gb2312`,...

    JSP中汉字乱码现象分析与解决.pdf

    本文详细探讨了JSP中汉字乱码现象的原因,并提供了一系列有效的解决方案。通过对JSP文件与响应编码方式的设置、文件头部的字节顺序标记(BOM)、表单数据的读取、请求参数的处理等多个方面进行深入分析,帮助开发者...

    JSP中文编码理论及乱码产生原因及问题解决

    本篇文章将深入探讨JSP中文编码理论,分析乱码产生的原因,并提供有效的解决方案。 一、编码基本知识 1. 字符编码:字符编码是计算机表示和处理文字的方式。常见的字符编码有ASCII、GB2312、GBK、GB18030、UTF-8等...

    JSP解决乱码与数据库乱码解决

    ### JSP解决乱码与数据库乱码解决方案 #### 一、引言 在Web开发中,尤其是使用Java Server Pages (JSP)技术时,字符编码问题是开发者常常遇到的一个难题。字符编码错误会导致页面显示乱码,严重影响用户体验。本文...

    jsp中文乱码问题解决

    jsp中文乱码问题产生的原因是由于jsp页面的编码方式和浏览器的编码方式不一致所致。jsp页面的编码方式默认为ISO-8859-1,而浏览器的编码方式默认为GBK或UTF-8。这样就会导致jsp页面中的中文字符乱码。 解决jsp中文...

    myeclipse中jsp的preview中文乱码完美解决方案

    本文将详细介绍如何解决MyEclipse中JSP页面预览时出现的中文乱码问题,并提供一个完善的解决方案。 #### 一、问题分析 首先,我们需要了解为什么会出现中文乱码的问题。通常来说,这个问题与字符编码设置不一致...

    页面乱码解决4种方案

    根据给定的信息,本文将详细解释四种常见的网页乱码解决方案,并着重分析其原理与实践方法。这四个场景分别是:JSP页面显示乱码、表单提交中文时出现乱码、数据库连接出现乱码以及数据库显示乱码的问题。这些解决...

    jsp乱码解决方案大全

    #### 二、JSP页面显示乱码解决方案 ##### 2.1 设置JSP页面编码格式 为了解决JSP页面的显示乱码问题,首先要确保JSP页面本身的编码设置正确。通常,在JSP页面头部添加以下代码: ```jsp ;charset=gb2312" %&gt; ``` ...

    JSP中文乱码的产生原因及解决方案

    在JSP开发中,中文乱码是一个常见的问题,它源于Java和JSP处理中文字符的方式。Java语言核心和class文件基于Unicode,确保了程序的跨平台性,但也为中文乱码问题埋下了伏笔。主要的乱码问题分为两类:一是Java和JSP...

    对jsp两个页面间传递变量出现变量乱码的解决

    首先,我们来看方案(一),这是通过在JSP脚本中设置字符编码来解决局部乱码的方法。在JSP页面中插入以下代码: ```jsp ("GBK"); %&gt; ("GBK"); %&gt; ``` 这两行代码分别设置了请求(Request)和响应(Response)的字符...

    MyEclipse中文乱码问题简单解决方案,不需任何编码转化

    这个解决方案可以直接应用于数据库插入、页面传递或 Servlet 中,解决了中文乱码问题。 首先,让我们了解什么是中文乱码问题。在中文计算机系统中,中文字符是使用 Unicode 编码来表示的。然而,在一些老旧的系统中...

Global site tag (gtag.js) - Google Analytics