Servlet中文乱码解决方法
- 格式:doc
- 大小:42.00 KB
- 文档页数:2
中⽂乱码问题及其解决办法1.解决HTML页⾯中的中⽂问题:为了使HTML页⾯很好地⽀持中⽂,就必须在每个HTML页⾯的头部增加如下代码:<HEAD>...<META http-equiv=Content-Type content="text/html;charset=gb2312">...<HEAD>2.解决JSP页⾯中的中⽂问题<%@ page contentType="text/html;charset=gb2312" language="java"%>3.解决Servlet请求和响应结果的中⽂问题为了使Servlet页⾯很好地⽀持中⽂,就必须在每个Servlet页⾯的头部增加如下代码:response.setCharacterEncoding("gb2312");request.setCharacterEncoding("gb2312");4.解决页⾯数据传输的中⽂问题为了使中⽂数据在各页⾯(组件)之间正常传递,最佳的⽅法就是采⽤编码过滤器来解决。
在WEB.XML中配置⼀个编码过滤器,内容如下:<!--定义编码过滤器--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>gb2312</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>5.解决HTTP(get)请求中的中⽂问题:在默认情况下,IE浏览器发“ISO-8859-1”的编码格式发送请求,如果接收到HTTP的get请求中⽂参数时出现乱码,就可以对其进⾏编码转换,例如:String param = request.getParameter("param");param = new String(param.getBytes("ISO-8859-1", "GB2312"));也可以通过修改Tomcat的server.xml⽂件来解决:<Connector port = "8080"...URIEncoding="GB2312"/> -->增加这项6.解决MySQL数据库的中⽂问题:解决MySQL数据库中⽂问题主要在JDBC驱动的URL上,例如:jdbc:mysql://localhost/test?user=root&password=123456&useUnicode=true&characterEncoding=gb2312在设计数据表的时候也要指明其编码⽅式。
JSP中文乱码种类
1.JSP文件中文内容显示乱码
2.调用Servlet显示乱码
3.Post表单乱码
4.Get参数乱码
5.存取数据库乱码
1
•通过浏览器调用JSP页面,在客户端浏览器中所有的中文内容出现乱码
•解决方案:替换ISO-8859-1,修改页面编码为UTF-8
调用Servlet显示乱码
•通过浏览器调用Servlet,Servlet在浏览器中显示内容出现乱码
调用Servlet显示乱码
•解决方案:在Servlet使用response在输出内容之前,先执行response.setContentType("text/html;charset=UTF-8")设定输出内容的编码为UTF-8
Post表单乱码
•提交页面表单元素给对应的JSP页面或者Servelt后,接收方出现表单数据中文值乱码
Post表单乱码
•解决方案:在接收POST提交的参数之前,使用request.setCharacterEncoding(“UTF-8")设定接收参数的内容使用UTF-8编码
Get查询字符串乱码
•用Get方式传递参数,中文字符会出现乱码
ISO8859_1ISO8859_1gb2312gb2312
客户端通过GET 提交中文编码问题简单流程:
假如:
客户端和服务器用gb2312
HTTP 传输编码用ISO8859_1
则:
服务器需要指示客户端文档的编码方式
Get查询字符串乱码
•解决方案:Get提交默认是以ISO88591传递,如果容器没有做配置修改,程序则需要手工进行编码转换
存取数据库乱码
•解决方案:在数据库连接参数中设置编码值。
中文乱码的处理1、将所有出现的编码方式都设为UTF-8或GB2312。
2、使用servlet过滤器(1)过滤器概念过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者Servlet 容器。
在WEB中,Servlet过滤器是服务器端WEB容器中的一个WEB组件,它们拦截请求和响应,并监视、修改或以某种方式处理正在交互的数据。
Servlet过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或JSP 页面之间,以及所包括的每个 JSP 页面之间。
(2)实现一个 Servlet 过滤器Servlet过滤器 API 包含javax.servlet包中的 3 个接口,分别是 Filter 、FilterChain 和 FilterConfig 。
实现一个 Servlet 过滤器要经历三个步骤。
[1]编写 Servlet 过滤器实现类。
[2]配置 Servlet 过滤器。
把该过滤器添加到 Web 应用程序中(通过在 Web 部署描述符 /web.xml 中声明它);[3]部署 Servlet 过滤器。
把过滤器与应用程序一起打包并部署它;Servlet容器对部署描述符中声明的每一个过滤器,只创建一个实例(或实例池)。
与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器时,也要注意线程安全的问题。
(3)编写过滤器实现类[1]Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter 接口<1> init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。
在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
<2> doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet 容器将先调用过滤器的doFilter方法。
IE6的“以UTF-8发送URL”选项设置对请求页面字符编码有影响吗?关键字: 字符编码最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,servlet容器使用Tomcat6.0,浏览器FireFox3.0、IE6,涉及字符编码设置的地方我的思路就是编码的地方都统一使用UTF-8,具体配置如下:1.所有页面的charset设置为UTF-8。
2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request 的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
其实这样的设置貌似是不会再出现乱码问题了,不过,问题依旧来了,如果我在浏览器的地址栏中输入中文参数提交,返回的页面却出现了乱码。
真搞不明白到底是哪里出了问题!说起来对中文乱码的问题一直是一支半解,出现乱码了,网上搜罗了一大堆资料,按照网上的配置,问题到是解决了,不过原理却搞的很模糊,一个请求发送到服务器,服务器业务逻辑处理后返回一个页面,这中间涉及的字符集转换,编码,解码过程一概不清楚。
这次,折腾了半天,总算是更进一步了解了字符编码问题,这里做个总结。
先看我的总结,有不对的地方欢迎批评。
首先我们看下,一个请求响应的流程浏览器 IE/FireFox -------->Servlet容器----------------->显示页面编码使用容器的URIEncoding转码解码我把用户发送请求方式不同引起的中文问题划分了四种类型:1、表单的get提交2、表单的post提交3、页面链接传递中文参数4、地址栏中参数直接输入中文提交1.首先我们看表单get方式提交浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器(如果有的话),不过Tomcat6.0对于get 提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。
今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet中我已经把request.setCharacterEncoding("GB2312");这段文字加入到代码中去,但是还是出现乱麻问题。
到网上找资料,如下:JAVA是Unicode编码,你先转换成ISO8859-1,然后再转换成GBK 或是GB2312.java 代码复制代码代码如下:request.setCharacterEncoding("ISO8859-1");ad=request.getParameter("name");byte[] temp3 = ad.getBytes("GBK");String str = new String(temp3);这样就是中文啦!还有一种更简单的方法,就是直接在服务器里设置编码转换。
用的是TOMCAT5.0.28。
在..\Tomcat 5.0\conf目录里找到SERVER.XML文件,用写字板打开它,设置如下:里面增加一个属性就可以了,URIEncoding="GBK"测试通过,搞定,然后就是request.setCharacterEncoding("GB2312")这句话到底起了什么作用,如果它不能解决乱麻问题,我们用它来起什么作用,整理资料如下:(一) JSP页面上是中文,但是看的是后是乱码:解决的办法就是在JSP页面的编码的地方,因为Jsp转成Java文件时的编码问题,默认的话有的服务器是ISO-8859-1,如果一个JSP中直接输入了中文,Jsp把它当作ISO8859-1来处理是肯定有问题的,这一点,我们可以通过查看Jasper所生成的Java中间文件来确认(二) 当用Request对象获取客户提交的汉字代码的时候,会出现乱码:解决的办法是:要配置一个filter,也就是一个Servelet的过滤器,代码如下:复制代码代码如下:public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding("GBK");// 传递控制到下一个过滤器chain.doFilter(request, response);}配置web.xml复制代码代码如下:<filter></filter><filter-name></filter-name>Set Character Encoding<filter-class></filter-class>SetCharacterEncodingFilter<filter-mapping></filter-mapping><filter-name></filter-name>Set Character Encoding<url-pattern></url-pattern>/*如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况,你的Form提交的数据是不是用get提交的,一般来说用post提交的话是没有问题的,如果是的话,你就看看第四中解决的办法。
解决中⽂乱码的⼏种解决⽅法(推荐)⾸先说明我的特殊情况:1. 前台jsp中,我使⽤的是 form post 请求,设置了 enctype="multipart/form-data" ,页⾯编码格式都是utf-82. 后台中,我使⽤的是commons-fileUpload组件,ServletFileUpload 解析form表单和⽂件,3. 设置 request.setCharacterEncoding("UTF-8");4. 设置了ServletFileUpload .setHeaderEncoding("UTF-8");5.Tomcat 的配置下⾯ server.xml 也已经设置了 URIEncoding="UTF-8";⾄此,按道理所有的格式都匹配上了,前后对应,解析出来的肯定是utf-8,但是经过formfield解析出来后任然是ISO-8859-1格式的编码,enctype="multipart/form-data" 会将数据以2进制的编码格式传递,因此我断定是 ServletFileUpload 解析时出了问题,多番查找,我的问题缺少了⼀步String formFieldValue = fileItem.getString("UTF-8");JSP和Servlet的六种中⽂乱码处理⽅法⼀、表单提交时出现乱码:在进⾏表单提交的时候,经常提交⼀些中⽂,⾃然就避免不了出现中⽂乱码的情况,对于表单来说有两种提交⽅式:get和post提交⽅式。
所以请求的时候便有get请求和post请求。
每种⽅式都有着不同的解决⽅法,之所以出现乱码,原因就在于get 请求时,其传递给服务器的数据是附加在URL地址之后的;⽽post的请求时,其传递给服务器的数据是作为请求体的⼀部分传递给服务器。