为什么getParameter会乱码

解决Tomcat中文乱码
本文介绍了解决Tomcat服务器中文乱码问题的方法,包括在Servlet中处理编码、修改Tomcat配置文件server.xml等步骤。

首先看一个乱码时的配置和操作,及其解决方法:

 

1、 Tomcat使用默认编码格式:iso-8859-1

2Servlet中执行request.getParameter(“name”),然后在控制台打印输出

3、前台html页面:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

此时,form表单get方式提交name文本框(内容输入“张三”)到先前的Servlet

监控到后台控制台输出:å¼ ä¸

 

解决方法:

1、 在ServletdoGet方法开始出执行:request.setCharacterEncoding(“utf-8”)

- Sorry, 无效

- 原因:此项设置仅对post提交且contentTypeapplication/x-www-form-urlencode的参数值有效

2、 Servlet中对getParameter的结果进行重编码,如下

new String(request.getParameter(“name”).getBytes(“iso-8859-1”), “utf-8”)

- Ok, 正确获取中文参数值

3、 修改tomcat默认配置,即在TOMCAT_HOME/conf/server.xmlConnector元素中加入URIEncoding=”utf-8”属性

TOMCAT中的server.xml中的
<Connector中添加两个设置useBodyEncodingForURI="true" //设置POST和GET使用相同编码
URIEncoding="UTF-8" //对URI使用utf-8编码处理
?
<Connector  useBodyEncodingForURI="true" URIEncoding="UTF-8"connectionTimeout="20000" maxThreads="150" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>

- Ok, 正确获取到中文参数值

 

如果你只想解决问题,那么你读到这里就完全可以了,。。。。。。但是,如果有一点好奇心、死脑经,或者受不了“在碰到乱码时, 总是记不住以前是怎么解决的,然后重复上网去找”,那么你应该问一下自己:为什么会出现乱码?或许,这其实只是一个简单的问题。。。

 

那么到底为什么呢?

其实很简单,就是encodeURI()URLDecoder.decode()的原因。

 

这里简单描述一个这两个东西是在以上的情况中如何导致最终乱码的:

1form使用get方式提交表单,此时会对其中的中文encodeURI转化为”%xx%xx…”的格式,这个你肯定知道,如以上中的张三会变成“%E5%BC%A0%E4%B8%89”

2、这一步是非常关键的一步,乱码的出处就是来自与这个,而且这一步是tomcat完成的。

那就是URLDecoder.decode(<url参数值>,<tomcat默认编码格式>),即在此处会执行URLDecoder.decode(“%E5%BC%A0%E4%B8%89”, “iso-8859-1”)

3、这一步是在ServletgetParamter(“name”),而返回的值就是第二步处理的结果:å¼ ä¸


额外的小灶:

 

如果你读到此处,已经完全明白是怎么回事,那么你可以离开了。但是,如果还是觉得云里雾里,或者不是很透彻,那么我觉得一定是你对java的字符编码相关的东东不是很清楚,在以下将对此做简单补充。

 

首先以一些些东西你必须知道:

 

常见的编码格式

 

Iso-8859-1属于定长单字节字符编码,用于拉丁字母,简称lat-1

ucsUnicode字符集,有两种格式:UCS-2UCS-4

utfucs转换格式,有UTF-8UTF-7UTF-16都是被广泛接受的方案。

utf-16是定长双字节字符编码,不兼容iso-8859-1, JVM运行时会使用

utf-8是不定长字符编码,与ISO-8859-1完全兼容

gb2312/gbk采用双字节编码(DBCS),GB18030 编码是一二四字节变长编码

 

#java字符编码相关方法

 

byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException

Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array. 

使用指定的字符编码格式对字符串进行编码,保存结果到字节数组


java.lang.String.String(byte[] bytes, String charsetName) throws UnsupportedEncodingException

Constructs a new String by decoding the specified array of bytes using the specified charset. The length of the new String is a function of the charset, and hence may not be equal to the length of the byte array.

使用指定的字符编码格式对字节数组进行编码,从而构造出一个字符串。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值