java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

这里先写几个你们容易搞混的编码设置代码:html

 

在jsp代码中的头部每每有这两行代码java

pageEncoding是jsp文件自己的编码
contentType的charset是指服务器发送给客户端时的内容编码
JSP要通过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。mysql

若是pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,sql

不然就由contentType属性中的charset决定,若是charset也不存在,JSP页面的字符编码方式就采用数据库

默认的ISO-8859-1。编程

 

还有一种是在服务端接受参数的编码:数组

response和request的setCharacterEncoding 区别浏览器

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

request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值。服务器

指定后能够经过getParameter()则直接得到正确的字符串,若是不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()以前,不能执行任何getParameter()。并且,该指定只对POST方法有效,对GET方法无效。分析缘由,应该是在执行第一个getParameter()的时候,java将会按照编码分析全部的提交内容,然后续的getParameter()再也不进行分析,因此setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()天然就无效。

get需在Tomcat的server.xml中的:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

URIEncoding="GBK" />

)加入URIEncoding="GBK",解决get请求乱码问题response.setContentType("text/html;charset=gb2312"):是设置页面中为中文编码。即以哪一种编码返回给客户端。

前者是设置动态文字(参数,数据库),后者设置页面静态文字

response.setContentType指定 返回给客户端的编码,同时指定了浏览器显示的编码. 


response.setCharacterEncoding设置HTTP 响应的编码,若是以前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖以前的设置.与response.setContentType相同的是,调用此方法,必须在getWriter执行以前或者response被提交以前.

 

 

JSP和Servlet的六种中文乱码处理方法

1、表单提交时出现乱码:

在进行表单提交的时候,常常提交一些中文,天然就避免不了出现中文乱码的状况,对于表单来讲有两种提交方式:get和post提交方式。因此请求的时候便有get请求和post请求。每种方式都有着不一样的解决方法,之因此出现乱码,缘由就在于get请求时,其传递给服务器的数据是附加在URL地址以后的;而post的请求时,其传递给服务器的数据是做为请求体的一部分传递给服务器。这也就致使了对它们所产生的乱码的处理方式是不一样的。

一、客户端的get请求

get提交时, 容器以容器的编码 来编码 若是用的tomcat 默认的编码是iso-8859-1 在server.xml里面设置编码 或者

代码以下

String name = request.getPara...("name"); 
String strName = new String(name.getByte("iso-8859-1"),"GBK");

 

对于不一样的请求方式,解决乱码的问题也是不同的,对于客户端的get请求来讲,服务器端处理要想不出现乱码,解决这个问题稍微复杂一些,须要用到String类型的构造函数,其中的一个构造函数就是用指定的编码方式去解码,通常都用“UTF-8”的方式。只要在服务器端将请求获得的参数从新构形成一个字符串就好了。

通过构造以后,客户端输入中文,且表单时get请求的状况下,str就变成了中文了。

二、客户端的post请求

对于客户端的post请求来讲,处理乱码的问题就比较简单了,由于请求的数据时做为请求体的一部分传递给服务器的,因此只要修改请求内的编码就好了。只要在服务器端的最开始处将请求的数据设置为“UTF-8”就好了,输入以下语句:request. setCharacterEncoding(“UTF-8”);这样用户在服务器端获取到的中文数据就再也不是乱码了。

2、超连接时出现乱码(低版本浏览器不行IE6)

在Web开发中,挺多的时候都是经过超连接去传递中文参数的,这也会致使在显示的时候也会出现乱码,对于超连接来讲,它其实是向服务器端发送了一个请求,而它发出的请求是属于get请求,因此对于超连接的乱码来讲,它处理乱码的方式和表单的get请求出现乱码的方式是同样的。

3、重定向时出现乱码(低版本浏览器不行IE6)

有时写上response的sendRedirect方法进行重定向时也会出现乱码,重定向时实际上也是向服务器发送了一个请求,因此解决乱码的方法和和上面是同样的。

4、浏览器版本低致使的乱码

上网的时候,有时提交的一些信息在地址栏显示的是“%2C%C6%CC%C6”的字样,其实这都是防止出现乱码进行的解决方案,若是你的浏览器是IE6或如下版本,则咱们的第二种状况和第三种状况会出现乱码(尤为是当中文是奇数的时候),这就很差使了因此咱们必须采用另外一种比较实际的做法:

在java.net包中提供了URLEncoder类和URLDcoder类,这两个类又分别提供了encode和decode两个静态方法,分别用于进行编码和解码。咱们将要传递的中文参数进行编码以后,在传递给服务器,服务器解码以后,就能够显示中文了。

进行编码:URLEncoder.encode(stuname,”UTF-8”)

传递给服务器:<a href=”/1.jsp?stuname<%=stuname%>”>传递</a>

进行解码:URLDecoder.decode(stuname,”UTF-8”)

5、返回浏览器显示的乱码

在Servlet编程中,常常须要经过response对象将一些信息返回给浏览器,给咱们的客户端,而咱们在服务器端显示的中文,可是响应给客户端浏览器倒是乱码,这主要是因为response对象的getWriter()方法返回的PrintWriter对象默认使用“ISO-8859-1”字符集编码进行Unicode字符串到字节数组的转换,因为ISO8859-1字符集中根本就没有包含中文字符,因此Java在进行转换的时候会将无效的字符编码输出给客户端,因而便出现了乱码,为此ServletResponse接口中便定义了setCharacterEncoding、setContentType等方法来指定getWriter方法返回的PrintWriter对象所使用的字符集编码,因此咱们在写Servlet程序中,在调用getWriter方法以前设置这些方法的值。

只要编写Servlet文件中含有响应给客户端的信息,那么就要写上这两句话。最好写上第二句话,由于它的优先级高,它的设置结果将覆盖setContentType等方法设置的字符编码集。

6、修改Tomcat的编码

在get请求所致使乱码问题中,还有一种解决的方案,咱们经常使用Tomcat做为运行Servlet和JSP的容器,而Tomcat内部默认的编码是ISO-8859-1,因此对于get请求方式,其传递的数据(URI)会附加在访问的资源后面,其编码是Tomcat默认的,若是修改该URI的编码,那么对于全部的get请求方式便不会出现乱码了包括上边说的重定向和超连接,在Tomcat的配置文件server.xml中找到修改Tomcat的端口的地方,在其内部加入URIEncoding属性,设置为和你的项目中所设的编码同样的值,这里所有都是UTF-8。

在编写Servlet和JSP的时候,为了不出现乱码,最重要的就是:采用一致的编码,若是编码都一致了,确定不会出现乱码。

以上这篇解决中文乱码的几种解决方法(推荐)就是小编分享给你们的所有内容了,但愿能给你们一个参考,也但愿你们多多支持脚本之家。

相关文章
相关标签/搜索