Java中文乱码破碎重组_解决中文乱码的几种解决方法(推荐)

首先说明我的特殊情况:

1. 前台jsp中,我使用的是 form post 请求,设置了 enctype="multipart/form-data" ,页面编码格式都是utf-8

2. 后台中,我使用的是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的请求时,其传递给服务器的数据是作为请求体的一部分传递给服务器。这也就导致了对它们所产生的乱码的处理方式是不同的。

1、客户端的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就变成了中文了。

2、客户端的post请求

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

二、超链接时出现乱码(低版本浏览器不行ie6)

在web开发中,挺多的时候都是通过超链接去传递中文参数的,这也会导致在显示的时候也会出现乱码,对于超链接来说,它实际上是向服务器端发送了一个请求,而它发出的请求是属于get请求,所以对于超链接的乱码来说,它处理乱码的方式和表单的get请求出现乱码的方式是一样的。

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

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

四、浏览器版本低导致的乱码

上网的时候,有时提交的一些信息在地址栏显示的是“%2c%c6%cc%c6”的字样,其实这都是防止出现乱码进行的解决方案,如果你的浏览器是ie6或以下版本,则我们的第二种情况和第三种情况会出现乱码(尤其是当中文是奇数的时候),这就不好使了所以我们必须采用另一种比较实际的作法:

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

进行编码:urlencoder.encode(stuname,”utf-8”)

传递给服务器:”>传递

进行解码:urldecoder.decode(stuname,”utf-8”)

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

在servlet编程中,经常需要通过response对象将一些信息返回给浏览器,给我们的客户端,而我们在服务器端显示的中文,但是响应给客户端浏览器却是乱码,这主要是由于response对象的getwriter()方法返回的printwriter对象默认使用“iso-8859-1”字符集编码进行unicode字符串到字节数组的转换,由于iso8859-1字符集中根本就没有包含中文字符,所以java在进行转换的时候会将无效的字符编码输出给客户端,于是便出现了乱码,为此servletresponse接口中便定义了setcharacterencoding、setcontenttype等方法来指定getwriter方法返回的printwriter对象所使用的字符集编码,所以我们在写servlet程序中,在调用getwriter方法之前设置这些方法的值。

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

六、修改tomcat的编码

在get请求所导致乱码问题中,还有一种解决的方案,我们常用tomcat作为运行servlet和jsp的容器,而tomcat内部默认的编码是iso-8859-1,所以对于get请求方式,其传递的数据(uri)会附加在访问的资源后面,其编码是tomcat默认的,如果修改该uri的编码,那么对于所有的get请求方式便不会出现乱码了包括上边说的重定向和超链接,在tomcat的配置文件server.xml中找到修改tomcat的端口的地方,在其内部加入uriencoding属性,设置为和你的项目中所设的编码一样的值,这里全部都是utf-8。

在编写servlet和jsp的时候,为了避免出现乱码,最重要的就是:采用一致的编码,如果编码都一致了,肯定不会出现乱码。

以上这篇解决中文乱码的几种解决方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值