首先一般乱码问题本质是由于,编解码用的 不是统一的码表;
web应用的页面编码设置一般是contentType="text/html; charset=UTF-8",而tomcat的默认编码是ISO-8859-1,所以这个时候双方进行通信就会出现乱码;可以将tomcat的编码修改,在项目servers下的server.xml中进行修改<Connector URIEncoding="UTF-8" connectionTimeout="2000" port="8080" protocol="HTTP/1.1" redirectPort="8843">,就可以将tomcat的编码表由ISO-8859-1改为UTF-8;
一,请求乱码
*
post提交乱码
可以在使用request对象之前,设置编码集 request.setCharacterEncoding("utf-8");------------------这个可以解决请求体中的中文乱码问题
get提交乱码
由于get提交的数据在地址栏中,具体是在请求头中,因此我们只能在后台获取到乱码的字符串value,然后手动的编解码 value = new String(value.getByte("ISO-8859-1"),"UTF-8");这样得到的velue就不乱了。
**
我们可以通过过滤器试图解决所有的servlet获取请求时的乱码,可以通过装饰包装的方法或动态代理的方法对request的getParameter方法进行增强,从而解决request.getParameter();获取的中文乱码;同样的方式解决前台的form表单提交,试图对request.getParaMeterMap();方法进行增强来解决中文乱码就会报错;Caused by: java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
二,响应乱码
*
切换response默认的码表(为response设置码表)
response.setCharacterEncoding("UTF-8");//在获取输出流之前设置
浏览器默认的解析码表为GBK
writer.write("<meta charset='UTF-8'>");这里的标签是模拟一个响应头,可以实现设置浏览器解析码表,但我们一般不用
response.setHeader("Content-Type","text/html;charset=UTF-8"); === response.setContentType("text/html;charset=UTF-8");
response的缓冲区的编码要与浏览器的解析码表一致,实际我们可以只设置浏览器的解析码表即可,tomcat会默认设置response缓冲区码表
response.setContentType("text/html;charset=UTF-8");这一行代码就可以解决乱码,但一定要 在获取输出流之前。
**
当响应给浏览器的内容是一个可以下载的文件时,除了设置响应头告诉浏览器,文件的类型,文件以附件形式打开,还要解决文件名字中文乱码的问题
response.setHeader("Content-Type", this.getServletContext().getMimeType(newfile));
response.setHeader("Content-Disposition", "attachment;filename="+filename);
文件的名字中文的时候,解决这个乱码因浏览器而异,一般通过下面的代码解决
String browser = request.getHeader("User-Agent");
String filename = "";
if (browser.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(newfile, "utf-8");
filename = filename.replace("+", " ");
} else if (browser.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(newfile.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(newfile, "utf-8");
}
三,cookie中存中文
*
在用cookie保存用户名的时候,发现cookie值不能存中文,报如下错:
Control character in cookie value, consider BASE64 encoding your value
错误发生在:response.addCookie(cookie);
在以前的编程中也碰到过这样的问题,主要是cookie值里面存在非法参数,如存在”\r\n”、”\n”之类的字符时就报报这样的错,但我就个用户名啊,不存在像这些字符啊,不管,我把cookie值设为一个默认的中文用户名,运行看是否出问题,果不其然,出现同样的错误,结果知道,cookie中不能保存中文。
最后想想把中文转换为UTF-8字符串进行保存应该没问题,即用 URLEncoder.encode(“中文用户名”,”UTF-8″)); 这样把中文用户名转换为UTF-8字符串,运行时通过。在最后接收这个值的时候,用URLDecoder.decode(cookies.getValue(),”UTF-8″);来解码得到我要的中文用户名。URLEncode及URLDecode在包 Java .NET里面