关于web项目中的乱码
来源:互联网 发布:htcg15软件下载 编辑:程序博客网 时间:2024/05/29 04:45
首先一般乱码问题本质是由于,编解码用的 不是统一的码表;
web应用的页面编码设置一般是contentType="text/html; charset=UTF-8",而tomcat的默认编码是ISO-8859-1,所以这个时候双方进行通信就会出现乱码;可以将tomcat的编码修改,在项目servers下的server.xml中进行修改<ConnectorURIEncoding="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里面
- 关于web项目中的乱码
- 关于java web项目中文乱码问题
- 关于web项目中中文乱码问题
- 关于web项目的乱码问题总结
- Java web项目中的乱码问题
- 【SSM】WEB项目中的中文乱码问题
- 关于myeclipse中的web项目重命名
- 关于Java WEB项目中中文乱码的解决方法
- 基于J2EE的web项目中的乱码问题
- web项目中的乱码问题的原因及解决办法
- 关于Java web开发中的中文乱码问题
- WEB项目 乱码终结
- WEB项目乱码解决
- web项目乱码问题
- web项目乱码问题
- web项目 中文乱码
- web开发中的乱码
- web中的乱码问题
- iOS用runtime访问隐藏的成员变量
- 初建cpp工程(.h文件和.cpp文件具体内容)
- mysql存储过程 loop循环
- 《绘王K28开箱测评》数位板
- 在Android中使用Lua脚本 —— Programing Lua on Android
- 关于web项目中的乱码
- DNS
- maven常用插件
- Hibernate之hibernate.hbm2ddl.auto
- 程序员必须掌握哪些算法?
- NodeJs学习笔记 02 -- Buffer
- 华为机试——字符串最后一个字符的长度
- LeetCode 104 Maximum Depth of Binary Tree
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误