中文乱码问题

一. 请求参数中的编码问题

1. 存在的问题:

当我们表单中有中文数据时,提交给服务器后,接收到的是中文乱码。

2. 分析:


(1)首先页面testParam.html里面有要传入的数据,比如张三,这个是字符(只要看得到的都是字符),而编码问题

就是字符和字节之间的转换,点击提交后,服务器会接收到这个数据,在这边传输会经过网络传输,是socket通

讯,网络传输只能传输0,1二进制代码,所以这个表单在传输之前首先要把字符变成字节,这时候就要看这个页

面是用什么编码,编码是utf-8。

(2)传到后台后,服务器会用request.getparameter去接收,而在服务器接收之前,这个名字是字节的形式存在

的,而getparameter方法可以把字节转换成字符,传给服务器的是用utf-8编码的。 而服务器端把字节转换成字

符又是用的什么编码呢?如果说转换成utf-8就不会出现中文乱码问题,所以出问题是服务器端字节转换成字符的

编码搞错了。

(3)服务器端默认会使用iso-8859-1进行解码的,那么如何解决这个问题?

3. 解决方法:

(1) 方案一:可以用手动重新解码的方式。

① 传过来的name字节数据以utf-8编码的,而使用name=request.getParameter(xxx)拿到的name变成一个字

符,但是编码是iso-8859-1,所以只要我们继续解码就可以。

② name.getBytes(“iso-8859-1”);它的意思是把一个iso-8859-1的字符变成iso-8859-1字节,之后再通过

new String,String里可以指定编码,也就是这里可以重新解码,把一个字节数据变成字符数据。重新把这个数

据用正确的编码重新解码一次,即name=new String(name.getBytes(“iso-8859-1”),”utf-8”);

③ 编码就是把字符串变成字节,解码就是把字节变成字符串。

④ 但是这种方式很不方便,传过来的每一个数据都需要进行解码,

(2) 方案二:可以全局设置编码。

① 我们的问题是服务器端进行解码时出错,我们可以在它进行解码之前就把编码改一下。也就是全局设置编码:

在调用request.getParameter()方法之前重新设置查询的码表。

②可以用request.setCharacterEncoding(“utf-8”);但是这个方法一定要在调用request.getParameter()方法

之前。因为我们是要改它解码的编码,如果不放在之前,等把数据拿出来再改毫无意义。

③ 所以这个方法最好放在doGet方法的第一行,但是这个方法是不通用的,post可以,get不可以。因为该方法

只能对请求实体内容的编码起作用,Post提交的数据在实体内容中,所以该方法对Post方法有效,而GET方法的

参数放在URI的后面,所以这种方法对Get方式是无效的。

④ 这时候POST没问题,但还需要对GET进行处理,那么处理的方式就只能用手动解码。但是只需要对GET进行

手动处理,POST不用,所以需要进行判断。

if("GET".equals(request.getMethod())){
	name=new String(name.getBytes("iso-8859-1"),"utf-8");
}

(3) 方案三:可以修改tomcat服务器的编码

也可以通过修改tomcat服务器的编码,只要在之前改端口的位置后加上URIEncoding=”utf-8”即可,这个方

式是改URI后面的数据的编码,但是不建议这样做。

4. 总结:

(1) 修改POST方式参数编码:request.setCharacterEncoding("utf-8");

(2) 修改GET方式参数编码:

手动解码:String name = new String(name.getBytes("iso-8859-1"),"utf-8");

二. 响应参数中的编码问题

1. 存在的问题:

服务器发给浏览器数据后,浏览器页面显示中文乱码。

2. 分析:


Tomcat服务器中response.getWriter().write(“中国”);服务器中的中国是字符,现在要把这个内容发送给浏

览器,要先把字符变成字节,默认会查询iso-8859-1码表,因为老外设计的很喜欢用iso-8859-1进行编码,只要

所用的方法涉及到字符转字节的话,默认编码采用iso-8859-1,现在把中国发给浏览器,浏览器是不认识的,就

需要改编码。

3. 解决方法:

(1) 在使用response.getWriter()方法之前,要先使用此方法response.setCharacterEncoding(“utf-8”);来设

置相应实体内容的编码。

(2) 这时候发给浏览器的是字节,在内部也需要把字节转换成字符,需要解码,所以这时候只要编码和解码的过程

没问题就能正确显示,但是浏览器的设置里有一个设置编码格式,这里的设置的是浏览器对需要解读的内容进行

解码的格式。

三. 编码问题总结:

1. 涉及编码问题的过程只有两个,分别如下:

(1) 表单提交请求给Tomcat服务器,提交请求过去要保证中文不会乱码应该怎么做?

如果表单的编码格式使用的是utf-8,那么需要使用request.setCharacterEncoding(“utf-8”);

(2) 如果服务器发数据给浏览器,响应就需要使用response.getWriter.write(“中国”);要保证它不出现中文乱

码,就需要在它之前输入response.setCharacterEncoding(“utf-8”);


2. 总结:

要完美解决项目中的编码问题,就需要在每个servlet的开头写:

Request.setCharacterEncoding(“utf-8”);

Response.setContentType(“text/html”;charset=utf-8);









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

处女座的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值