首先看一个乱码时的配置和操作,及其解决方法:
1、 Tomcat使用默认编码格式:iso-8859-1
2、Servlet中执行request.getParameter(“name”),然后在控制台打印输出
3、前台html页面:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
此时,form表单get方式提交name文本框(内容输入“张三”)到先前的Servlet
监控到后台控制台输出:å¼ ä¸
解决方法:
1、 在Servlet中doGet方法开始出执行:request.setCharacterEncoding(“utf-8”)
- Sorry, 无效
- 原因:此项设置仅对post提交且contentType为application/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.xml中Connector元素中加入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()的原因。
这里简单描述一个这两个东西是在以上的情况中如何导致最终乱码的:
1、form使用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、这一步是在Servlet中getParamter(“name”),而返回的值就是第二步处理的结果:å¼ ä¸
额外的小灶:
如果你读到此处,已经完全明白是怎么回事,那么你可以离开了。但是,如果还是觉得云里雾里,或者不是很透彻,那么我觉得一定是你对java的字符编码相关的东东不是很清楚,在以下将对此做简单补充。
首先以一些些东西你必须知道:
# 常见的编码格式
Iso-8859-1属于定长单字节字符编码,用于拉丁字母,简称lat-1
ucs是Unicode字符集,有两种格式:UCS-2和UCS-4
utf是ucs转换格式,有UTF-8、UTF-7、UTF-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.
使用指定的字符编码格式对字节数组进行编码,从而构造出一个字符串。