zoukankan      html  css  js  c++  java
  • 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编码,所以就可以显示中文了。

     相关推荐:

  • 相关阅读:
    border——边框属性
    CSS1,CSS2选择器详解
    CSS样式表与HTML结合的方法
    详细解析HTML基础结构
    jquery 解析xml
    asp.net js调用后台方法
    asp.net利用剪切板导出excel
    webform 不实用office控件导出excel StringBuilder 类型拼接字符串表格导出excel
    Android再学习-20141018-布局-进度条
    Android再学习-20140928-布局
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/6525546.html
Copyright © 2011-2022 走看看