关于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里面
0 0
原创粉丝点击