中文乱码问题(项目以UTF-8为例子)
来源:互联网 发布:云计算工程师要学什么 编辑:程序博客网 时间:2024/05/22 09:28
要点:
本质是:提交数据的方式不同,进行数据加码不同,所以解码不同.(GET方式处理和POST方式处理)post方式处理编码简单. request.setCharacterEncoding("UTF-8");get方式处理编码复杂.get方式要特殊处理,因为是URL提交,会自动将汉字转化为特殊的编码
要点:
要点:中文数据和特殊字符都是转码成了16进制数据前面加%a.客户端将数据发送到服务器后在服务器端解析将还原中文需要操作的是request.request.setCharacterEncoding("UTF-8");//用来解决post乱码request.getParameter("parameterName");//获取数据此时如果是post的话还要特殊转码.(完整代码如下)new String(request.getParameter("fileName").getBytes("ISO-8859-1"), "UTF-8");b.服务器端将数据发回浏览器端同样也要设置编码,这样在页面中才能显示成中文.操作的是response.response.setContentType("text/html;charset=UTF-8");(这里设置的数据的加码,应该与浏览器解码用的编码一致,才能显示正常.)
"你"转码为: %E4%BD%A0
要点:
在服务器端解码的时候,项目是什么编码就只能转成什么编码中文才能正常显示,同理在将中文数据发到页面时候也只能发送与页面相同的编码数据浏览器才能正常显示中文.由于get方式通过URL是转码成了ISO-8859-1,所以当项目是ISO-8859-1项目时候,不设置response.setContentType()也是能正常显示的.
发生中文乱码有三种情况:(本质是GET方式处理和POST方式处理)
1.表单
(1)post 解决方法: request.setCharacterEncoding("UTF-8");//当问get方式提交时候,该设置无效,可以不要?是
(2)get 解决办法: new String(str.getBytes("ISO-8859-1"),"UTF-8");
2.超链接(本质是GET提交URL传参提交)处理方式与get方式提交一样.
<a href="http://www.baidu.com?name=你好">测试</a>
3.response.sendRedirect("pages/forwardShow.jsp");
// (本质是URL提交,在servlet中进行了转码成功获取数据后重定向又会被加码成ISO-8859-1)
注意: response.sendRedirect("跳转地址?name=中文"); 这里在url中传递时不能直接手写中文,会无效。
如果要传递可以向用变量来 再传递message
String message ="中文";
response.sendRedirect("跳转地址?name="+message);
特别说明:
如果浏览器是IE6及以下版本,则第2和3种情况中仍然会出现乱码(当中文是奇数时会出现乱码),这时候需要编码后再传向页面:
String result = java.net.URLEncoder.encode("待传的数据", "UTF-8");
补充:
用Servlet做文件上传的时候用的是本质用的post提交,所以处理方式同post一样。
request.setCharacterEncoding("UTF-8");
思考:
如果是forward转发数据,在下一个servlet中处理方式还是一样看数据源是什么格式.
其源头还是看数据在传输的时候是采用的什么编码,比如在编码的时候用的UTF-8,那么解码自然就用UTF-8来解,就可以解决乱码问题,注意UTF-8和gbk和ISO-8859-1之间是不能互转的,如果有有中文,解码和编码的不是同一个charset 那么就会出现乱码.
public static void testEncode() {// 验证 编码和解码
// 结论:
// 如果字符串中有中文一定要在编码的时候指定能支持中文的编码EG:UTF-8;GB2312;gbk
// (也就是在得到byte[]的时候指定编码),然后解码的时候指定编码的时候的编码就可以正确解码
// 特别注意的是: bgk 和UTF-8之间是不能互相转换的.
String message = "yves你好";
try {
byte[] result = message.getBytes("UTF-8");// ISO-8859-1 GB2312
// UTF-8
System.out.println(new String(result, "UTF-8"));// 显示正确
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 结论:
// 如果字符串中有中文一定要在编码的时候指定能支持中文的编码EG:UTF-8;GB2312;gbk
// (也就是在得到byte[]的时候指定编码),然后解码的时候指定编码的时候的编码就可以正确解码
// 特别注意的是: bgk 和UTF-8之间是不能互相转换的.
String message = "yves你好";
try {
byte[] result = message.getBytes("UTF-8");// ISO-8859-1 GB2312
// UTF-8
System.out.println(new String(result, "UTF-8"));// 显示正确
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
1 0
- 中文乱码问题(项目以UTF-8为例子)
- myeclipse 编码设置及乱码问题(项目开始时,应该检查一下设置是否都为UTF-8编码格式,以防止中文乱码问题).
- 中文乱码问题及tomcat设置编码为utf-8
- GB2312 转化为 UTF-8 中文乱码
- Java项目中文乱码,设置UTF-8
- Spark 处理中文乱码问题(UTF-8编码)
- utf-8网页中文乱码问题
- utf-8网页中文乱码问题
- 彻底解决PHPMyAdmin中文UTF-8乱码问题
- 彻底解决PHPMyAdmin中文UTF-8乱码问题
- ZF解决中文UTF-8乱码问题
- asp.net utf-8 中文乱码问题
- Hibernate MySQL 中文乱码问题 UTF-8
- 解决HTML5 UTF-8 中文乱码问题
- Atom中文显示乱码问题 UTF-8
- mysql UTF-8 中文乱码问题
- 中文乱码问题(编码格式utf-8)
- HTML UTF-8 中文乱码问题
- AFNetWorking 内存泄漏的问题 -- AFHTTPSessionManager --Instruments体检结果分享
- iOS 10.0之前和之后的Local Notification有神马不同
- hdu ---2039做题笔记
- java面向对象的三大特性的学习笔记
- 自定义微信公众号菜单一二级选项(二)
- 中文乱码问题(项目以UTF-8为例子)
- CC2530定时器配置笔记1(基本定时功能配置)
- The Dependency Inversion Principle
- 寄存器比内存访问速度快的原因
- Ajax 的POST请求...
- java几种对象(Po、Vo、Dao、DTO、Bo、PoJo)
- Flask实践Step by Step -- Web表单
- 润乾报表-时间日期函数
- WEB前端 | JS基础——(5)字符串和时间