中文乱码问题(项目以UTF-8为例子)

来源:互联网 发布:云计算工程师要学什么 编辑:程序博客网 时间:2024/05/22 09:28
要点:
本质是:提交数据的方式不同,进行数据加码不同,所以解码不同.(GET方式处理和POST方式处理)
post方式处理编码简单.  request.setCharacterEncoding("UTF-8");
get方式处理编码复杂.get方式要特殊处理,因为是URL提交,会自动将汉字转化为特殊的编码
要点:
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");(这里设置的数据的加码,应该与浏览器解码用的编码一致,才能显示正常.)
要点:中文数据和特殊字符都是转码成了16进制数据前面加%
"你"转码为: %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();
        }
    }





1 0
原创粉丝点击