`
hotforcc
  • 浏览: 61254 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet 乱码问题

    博客分类:
  • j2se
阅读更多
今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet中我已经把request.setCharacterEncoding("GB2312");这段文字加入到代码中去,但是还是出现乱麻问题。
 到网上找资料,如下:JAVA是Unicode编码,你先转换成ISO8859-1,然后再转换成GBK或是GB2312.
   
java 代码
  1. request.setCharacterEncoding("ISO8859-1");    
  2. ad=request.getParameter("name");    
  3. byte[] temp3 = ad.getBytes("GBK");    
  4. 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提交的话是没有问题的,如果是的话,你就看看第四中解决的办法。
 
还有就是对含有汉字字符的信息进行处理,处理的代码是:
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>
分享到:
评论
7 楼 sorphi 2007-08-30  
再贴一篇,关于是否能自动判断post方式提交过来的数据编码

http://www.jsfsoft.com:8080/beyond-pebble/pinxue/2006/07/27/1153934754918.html
6 楼 laiseeme 2007-08-30  
看我博客里面这个文章  在tomcat里面设置一下
http://laiseeme.iteye.com/blog/112604
5 楼 sorphi 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参数。

4 楼 hotforcc 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认证。
3 楼 firebody 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


2 楼 licco1 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默认的编码格式?
1 楼 liusong1220 2007-08-28  
页面上还有个 pageEncoding 的选项
这个可以设置页面内容在服务器端处理的编码

相关推荐

    ajax到servlet乱码解决

    在 Web 开发中,使用 AJAX 通过 URL 传参数给 Servlet 时,经常会遇到乱码问题,即使使用了统一的字符编码也没用。下面我们来探讨这个问题的解决方案。 问题描述 当我们使用 AJAX 通过 URL 传参数给 Servlet 时,...

    tomcat与servlet乱码解决办法

    ### Tomcat与Servlet乱码问题解析及解决方案 #### 一、引言 在Web开发过程中,经常遇到的一个问题就是字符编码的问题,特别是在处理中文字符时,如果编码设置不当,很容易出现乱码的情况。本文主要围绕Tomcat服务器...

    java,jsp,servlet 乱码

    Java、JSP 和 Servlet 乱码问题是一个常见的开发难题,主要涉及到字符编码的不一致,导致数据在不同阶段出现解码错误。以下是一些解决乱码问题的关键知识点: 1. **页面编码设置**: - 静态HTML页面可以通过`...

    servlet乱码及解决

    这是servlet出现乱码,以及乱码出现时的解决办法。

    servlet中文乱码问题

    ### Servlet + Tomcat 中文乱码问题解析及解决方案 #### 一、中文乱码问题概述 在使用Servlet和Tomcat进行Web开发时,经常会遇到中文乱码的问题。这主要是因为客户端(如浏览器)与服务器之间使用的字符编码不一致...

    servlet输出JS乱码问题

    知识点:Servlet输出JS乱码问题解析与解决方案 一、Servlet与JS输出背景 Servlet是Java Web应用中的核心组件,主要用于处理客户端发送的HTTP请求,并生成响应。在Web开发中,Servlet经常被用来处理业务逻辑,然后...

    Servlet 中文乱码问题

    在Java的Servlet开发中,中文乱码问题是一个常见的困扰,主要涉及到请求(request)和响应(response)两个方面。本文将详细解析这两个方面的乱码问题及其解决方案。 首先,我们需要了解一些基础知识。GBK编码是一种...

    解决servlet页面乱码问题

    通过以上步骤,你应该能够有效地解决Servlet页面的乱码问题。记住,关键在于统一字符集,并在所有环节进行正确设置。对于初学者来说,理解这些概念并熟练应用,将有助于避免和解决这类常见问题。

    servlet输出中文乱码问题

    ### servlet输出中文乱码问题详解 #### 一、问题背景 在进行Web开发时,特别是使用Java Servlet处理HTTP请求的过程中,经常会遇到输出中文字符时出现乱码的问题。这不仅会影响用户体验,还会对项目的正常运行造成...

    解决servlet中文乱码问题1

    解决servlet中文乱码问题1 在servlet编程中,中文乱码问题是常见的困扰,但是通过正确的配置和编码设置,可以轻松地解决这个问题。 标题解释 解决servlet中文乱码问题1的标题指的是,如何在servlet应用程序中正确...

    servlet过滤器解决乱码问题

    ### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...

    Jsp和Servlet中文乱码问题

    本文将深入探讨JSP和Servlet中文乱码问题的根源、解决方案以及预防策略。 ### JSP和Servlet中的中文乱码问题根源 中文乱码问题通常源于字符编码不一致或配置错误。在Web应用中,数据流经多个环节,包括客户端...

    jsp传参 servlet接收中文乱码问题的解决方法.docx

    jsp 传参 servlet 接收中文乱码问题的解决方法 jsp 传参 servlet 接收中文乱码问题是一个经常遇到的问题,特别是在使用 Hibernate+Servlet 框架时。当我们在 jsp 页面传参到 servlet 时,中文字符经常会出现乱码...

    servlet与jsp中文乱码处理

    通过以上方法,基本可以解决servlet和jsp在接收和显示中文时的乱码问题。但在实际开发中,可能还需要根据具体环境和需求进行调整。了解这些知识点,对于Java Web开发者来说是非常必要的,能够提高项目的稳定性和用户...

    解决jsp+servlet开发中的中文乱码问题

    ### 解决JSP+Servlet开发中的中文乱码问题 #### 概述 在基于JSP(Java Server Pages)和Servlet技术的Java Web应用开发过程中,中文乱码问题一直是困扰开发者的一大难题。由于Java Web应用程序涉及多个组件之间的...

    Servlet中的中文乱码问题

    然而,处理中文字符时,Servlet经常会出现乱码问题,这通常是由于字符编码设置不正确导致的。本篇文章将深入探讨如何解决Servlet中的中文乱码问题,以及如何在GBK、UTF-8和ISO-8859-1之间做出合理的选择。 首先,...

    servlet过滤器Api 以及乱码处理.javascript注入问题

    乱码问题在Web开发中是一个常见的挑战。Servlet过滤器可以有效地解决这个问题。例如,我们可以通过在过滤器中设置请求和响应的编码方式来确保正确的字符编码。以下是一个简单的例子: ```java public void doFilter...

    javaweb servlet(jsp)的乱码问题原理及解决

    ### javaweb servlet(jsp)的乱码问题原理及解决 #### HTTP协议的基本理解与乱码问题背景 HTTP协议作为互联网应用中最为广泛使用的通信协议之一,它定义了客户端和服务端之间的交互规则。HTTP请求主要分为GET和...

    servlet中解决乱码

    本文将深入探讨如何在Servlet中解决乱码问题,确保数据正确无误地进行编码和解码。 首先,我们需要了解Java Servlet生命周期中的两个关键阶段:`service()`方法和`doGet()`或`doPost()`方法。在这些方法中,我们...

    jsp+servlet+mysql乱码解决的这天

    jsp+servlet+mysql乱码解决方案是指在使用jsp+servlet+mysql开发web应用程序时,如何解决中文乱码问题的解决方案。该方案通过设置每个页面的编码格式为utf-8,控制器servlet中的请求编码格式为utf-8,数据库连接url...

Global site tag (gtag.js) - Google Analytics