浏览 13797 次
锁定老帖子 主题:Servlet 乱码问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-25
今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet中我已经把request.setCharacterEncoding("GB2312");这段文字加入到代码中去,但是还是出现乱麻问题。
到网上找资料,如下:JAVA是Unicode编码,你先转换成ISO8859-1,然后再转换成GBK或是GB2312. java 代码
这样就是中文啦! 还有一种更简单的方法,就是直接在服务器里设置编码转换。用的是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提交的话是没有问题的,如果是的话,你就看看第四中解决的办法。 还有就是对含有汉字字符的信息进行处理,处理的代码是: public String toUni(String gbStr){ String uniStr = ""; if(gbStr == null){ gbStr = ""; } try{ byte[] tempByte = gbStr.getBytes("GB2312"); uniStr = new String(tempByte,"ISO8859_1"); }catch(Exception ex){ } return uniStr; } } 你也可以在直接的转换,首先你将获取的字符串用ISO-8859-1进行编码,然后将这个编码存放到一个字节数组中,然后将这个数组转化成字符串对象就可以了,例如: String str=request.getParameter(“girl”); Byte B[]=str.getBytes(“ISO-8859-1”); Str=new String(B); 通过上述转换的话,提交的任何信息都能正确的显示。 (三) 在Formget请求在服务端用request. getParameter(“name”)时返回的是乱码;按tomcat的做法设置Filter也没有用或者用 request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上:如果在servlet中用 doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了: request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); 也是不起作用的,返回的中文还是乱码!!!如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。 同样,在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的,改成get方法依旧不行。 由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息,很有可能引起常用字符集的冲突或是不匹配。 //这个地方理解为request.setCharacterEncoding("GBK");set的是request中的body,而不是header部分,get请求时把参数放在url后边,不是放在body中,所以这个时候request.setCharacterEncoding("GBK")就没有起到作用,换到post提交就没有问题了,经测试通过,!! 解决的办法是: 1) 打开tomcat的server.xml文件,找到区块,加入如下一行: URIEncoding=”GBK” 完整的应如下: <connector uriencoding="GBK" maxthreads="150" debug="0" redirectport="8443" port="8080" enablelookups="false" maxsparethreads="75" minsparethreads="25" connectiontimeout="20000" disableuploadtimeout="true" acceptcount="100"></connector> 2)重启tomcat,一切OK。 tomact.org给的解释 This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 也就是说转换了URI的bytes,request.setCharacterEncoding("GBK")把request也转换了,问题就ok了! (四) JSP页面上有中文,按钮上面也有中文,但是通过服务器查看页面的时候出现乱码: 解决的办法是:首先在JSP文件中不应该直接包含本地化的消息文本,而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中,这个文件放在WEB-INF/classes/* 下,例如我在页面里有姓名,年龄两个label,我首先就是要建一个Application.properties,里面的内容应该是name=”姓名” age=”年龄”,然后我把这个文件放到WEB-INF/classes/properties/下,接下来根据 Application.properties文件,对他进行编码转化,创建一个中文资源文件,假定名字是 Application_cn.properties。在JDK中提供了native2ascii命令,他能够实现字符编码的转换。在DOS环境中找到你放置Application.properties的这个文件的目录,在DOS环境中执行一下命令,将生成按GBK编码的中文资源文件 Application_cn.properties:native2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件: name=u59d3u540d age=u5e74u9f84,在Struts-config.xml中配置:<message-resources parameter="properties.Application_cn"></message-resources>。到这一步,基本上完成了一大半,接着你就要在JSP页面上写 <!---->,到名字的那个label是要写<bean:message key="”name”">,这样的化在页面上出现的时候就会出现中文的姓名,年龄这个也是一样,按钮上汉字的处理也是同样的。 (五) 写入到数据库是乱码: 解决的方法:要配置一个filter,也就是一个Servelet的过滤器,代码如同第二种时候一样。 如果你是通过JDBC直接链接数据库的时候,配置的代码如下:jdbc:mysql://localhost:3306/workshopdb? useUnicode=true&characterEncoding=GBK,这样保证到数据库中的代码是不是乱码。 如果你是通过数据源链接的化你不能按照这样的写法了,首先你就要写在配置文件中,在tomcat 5.0.19中配置数据源的地方是在C:Tomcat 5.0confCatalinalocalhost这个下面,我建立的工程是workshop,放置的目录是webapp下面,workshop.xml 的配置文件如下: <!----> <context debug="0" path="/workshop" docbase="workshop"></context>reloadable="true" > <resource name="jdbc/WorkshopDB"></resource>auth="Container" type="javax.sql.DataSource" /> <resourceparams name="jdbc/WorkshopDB"></resourceparams> <parameter></parameter> <name></name>factory <value></value>org.apache.commons.dbcp.BasicDataSourceFactory <parameter></parameter> <name></name>maxActive <value></value>100 <parameter></parameter> <name></name>maxIdle <value></value>30 <parameter></parameter> <name></name>maxWait <value></value>10000 <parameter></parameter> <name></name>username <value></value>root <parameter></parameter> <name></name>password <value></value> <!----> <parameter></parameter> <name></name>driverClassName <value></value>com.mysql.jdbc.Driver <parameter></parameter> <name></name>url <value></value> 粗体的地方要特别的注意,和JDBC直接链接的时候是有区别的,如果你是配置正确的化,当你输入中文的时候到数据库中就是中文了,有一点要注意的是你在显示数据的页面也是要用<!---->这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的,写了一个Form的时候把他改成了一个jsp,这样有一个地方要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他该过来,因为在jsp的提交的过程中紧紧就是POST和 GET两种方式,但是这两种方式提交的代码在编码方面还是有很大不同的,这个在后面的地方进行说明。</bean:message></bean:message> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-28
页面上还有个 pageEncoding 的选项
这个可以设置页面内容在服务器端处理的编码 |
|
返回顶楼 | |
发表时间:2007-08-30
很感谢,楼主花了精力,帮我们了解了这么多,不过你还是没说清楚request.getCharacterEncoding(String code),按字面理解,应该是把request里的字符编码为code型,期待高人继续说明这个问题;还有jsp页头的charset和 pageEncoding,表示的是什么意思(pageEncoding我的理解和楼上liusong1220兄弟的一样,就是编码的格式,那 charset又是用来干什么的呢,是不是设置request中的字符编码格式?)。还有,server产生一个新的request的过程中, request内的字符格式是什么?是页面上的charset格式,ISO-8859-1,unicode,还是server默认的编码格式?
|
|
返回顶楼 | |
发表时间:2007-08-30
基本上做过web开发的都会碰到这样的问题,LZ写了这么多,从“配置”上来说,基本上是正确的,但是研究问题如果仅仅从如何“配置正确”入手的话,还是有点不好理解,最好从背后原理再了解一下。
有几个问题指出一下: 1) URLEncode 可以代替LZ那个自己写的复杂函数 2) post和 get方式的乱码是因为浏览器和http服务器对此有不同的处理造成的。post涉及到request-body,get涉及到 url encode. 如果大家想更清楚了解原理的话,有一篇文章写的不错,推荐大家看一下: http://hi.baidu.com/dand2008/blog/item/d9cdf9fcbde506fffd037f69.html |
|
返回顶楼 | |
发表时间:2007-08-30
firebody 1 小时前 基本上做过web开发的都会碰到这样的问题,LZ写了这么多,从“配置”上来说,基本上是正确的,但是研究问题如果仅仅从如何“配置正确”入手的话,还是有点不好理解,最好从背后原理再了解一下。 有几个问题指出一下: 1) URLEncode 可以代替LZ那个自己写的复杂函数 2) post和 get方式的乱码是因为浏览器和http服务器对此有不同的处理造成的。post涉及到request-body,get涉及到 url encode. 如果大家想更清楚了解原理的话,有一篇文章写的不错,推荐大家看一下: http://hi.baidu.com/dand2008/blog/item/d9cdf9fcbde506fffd037f69.html thanks firebody,谢谢你的回答和建议,我会在以后把相关的原理内容列出来 其实有很多web的原理和实用的东西可以从这本书得到答案<<head first servlet&jsp>>这本书得到答案。比较入门级的,比较通俗。同时看完之后可以通过SCWCD这个java认证。 |
|
返回顶楼 | |
发表时间:2007-08-30
引用 http://hi.baidu.com/dand2008/blog/item/d9cdf9fcbde506fffd037f69.html 2、 POST提交 对于POST方式,表单中的参数值对是通过request body发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。 在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。 我就碰到过这个问题。页面A,response显示时ContentType为UTF-8,POST提交都自身,request接收时Encoding也是UTF-8,没有烦恼的乱码问题。结果另外一个遗留系统的页面B,ContentType为GBK,POST提交到网页A,出现乱码了。最后不得不在A网页的post参数中再多判断一个charset参数。 |
|
返回顶楼 | |
发表时间:2007-08-30
看我博客里面这个文章 在tomcat里面设置一下
http://laiseeme.iteye.com/blog/112604 |
|
返回顶楼 | |
发表时间:2007-08-30
再贴一篇,关于是否能自动判断post方式提交过来的数据编码
http://www.jsfsoft.com:8080/beyond-pebble/pinxue/2006/07/27/1153934754918.html |
|
返回顶楼 | |