JavaWeb get请求乱码处理

乱码终极解决方案 

Author:Marydon

一、安装好eclipse/myeclipse后,先将开发环境改成UTF-8;
  更改工作空间编码方式
  window-->preferences-->general-->workspace-->更改默认的编码方式
二、导入项目乱码问题
  方法一:更改导入项目的编码方式
    选中当前项目-->右键-->properties-->resources-->将编码方式改为utf-8;
  方法二:更改工作空间编码方式
    window-->preferences-->general-->workspace-->更改默认的编码方式
三、配置TOMCAT解决GET请求乱码问题
  方法一:
    config文件夹-->server.xml文件中配置Connector标签的端口号8080添加属性:URIEncoding="UTF-8";端口号为8009的同样添加该属性;
  方法二:
    前台界面使用encodeURI()方法转码->"getClassBycNameAction?cname="+encodeURI(cname)
    后台接收再转码一次-->URLDecoder.decode(cname,"utf-8")
四、解决ajax传参乱码问题
  post/get方式
    前台利用encodeURI(变量名/"字符串");
    后台接收用URLDecoder.decode(变量名,"utf-8");
五、解决form表单提交类型enctype="multipart/form-data"的中文乱码问题
  String name = request.getParameter("stuName");
  String stuName = new String(name.getBytes("iso8859-1"),"utf-8");

UpdateTime--2017年10月31日15:03:56

六、设置Content-Disposition(指定下载该文件时的文件名)

response.setHeader("content-disposition", "attachment;filename=" + fileName);

会出现的情况:

  情况一:当文件名中带有中文会出现乱码

  解决方法:对文件名以utf-8的形式进行编码,即

// 以UTF-8格式进行编码
fileName = java.net.URLEncoder.encode(fileName,"UTF-8");

  情况二:用URLEncoder编码,当中文文字超过17个时,IE 无法下载文件。

  原因:可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也不对。

  解决方法:将文件名编码成ISO8859-1,即

fileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");

  情况三:文件名中出现的空格

  综合上面三种情况进行整合

import org.apache.commons.lang.StringUtils;
public static String encodingFileName(String fileName) {
    String returnFileName = "";
    try {
        returnFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
        returnFileName = StringUtils.replace(returnFileName, "+", "%20");
        if (returnFileName.length() > 150) {
            returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");
            returnFileName = StringUtils.replace(returnFileName, " ", "%20");
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return returnFileName;
}   

编码转换的原理:

首先在源程序中将编码设置成GB2312字符编码,然后将源程序按Unicode编码转换成字节码加载到内存中(java加载到内存中的字节码都是Unicode编码),然后按GB2312编码获得中文字符串的字节数组,然后生成按ISO8859-1编码形式的Unicode字符串(这时的4个字节就变成了8个字节,高位字节补零),当在网络中传输时,因为setHeader方法中的字符只能按ISO8859-1传输,所以这时候就又把Unicode字符转换成了ISO8859-1的编码传到浏览器(就是把刚才高位补的零全去掉),这时浏览器接收到的ISO8859-1码的字符因为符合GB2312编码,所以就可以显示中文了。

 

 相关推荐:

 

posted @ 2017-03-09 14:31  Marydon  阅读(573)  评论(0编辑  收藏  举报