• Servlet相关的几种乱码


    1. 页面中文显示乱码

    原因: response中的内容会先输入到response缓冲区,然后再输入到传给浏览器,所以要将缓冲区和浏览器的编码都设置成utf-8
    1)未使用jsp,而是在servlet设置response输入内容中存在中文

    • 解决方案: 在response.getWriter()输出内容之前加上下面两行代码
    response.setCharacterEncoding("UTF-8");// 设置缓冲区编码
    response.setContentType("text/html;charset=UTF-8");// 设置浏览器编码 
    

    2)使用了jsp

    • 解决方案: 在jsp头部写上如下代码:
      <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

    2.request乱码问题(在请求参数中带有中文)

    原因:

    • 浏览器传输参数时使用的是ISO-8859-1编码不支持中文
    • 高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])

    解决方案:

    • 先将获取的参数用ISO-8859-1解码成二进制流,然后再用utf-8进行编码,代码如下:
    String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8");// username为获取的参数
    • 对于post请求还可以使用如下方法  
    request.setCharacterEncoding("utf-8");
    • 对于高版本的tomcat,在修改tomcat目录下的conf/catalina.properties中,找到最后注释掉的一行#
    #tomcat.util.http.parser.HttpParser.requestTargetAllow=| 
    

    去除#并改成

    tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
    

    表示把{}放行

    3.设置附件下载时中文名没有了

    原因: 不同浏览器会对附件的文件名进行解码 解决方案: 争对不同浏览器进行编码,代码如下:

    // 获取客户端信息
    String agent = request.getHeader("User-Agent");
    // 定义一个变量记录编码之后的名字
    String filenameEncoder = "";// 新附件的文件名,用于传给浏览器
    if (agent.contains("MSIE")) {
    	// IE编码
    	filenameEncoder = URLEncoder.encode(filename, "utf-8");  // filename 是原附件的文件名
    	filenameEncoder = filenameEncoder.replace("+", " ");
    } else if (agent.contains("Firefox")) {
    	// 火狐编码
    	BASE64Encoder base64Encoder = new BASE64Encoder();
    	filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";// filename 是原附件的文件名
    } else {
    	// 浏览器编码
    	filenameEncoder = URLEncoder.encode(filename, "utf-8");// filename 是原附件的文件名
    }
    
    
  • 相关阅读:
    babel初学教程
    手机cs端改变跳转方式
    web.xml 中的listener、 filter、servlet 加载顺序及其详解
    Linux下cp直接覆盖不提示的方法!
    JAVA中用CALENDAR类计算周和周的起始日期(转)
    [android反编译小结]apktool/ AXMLPrinter2.jar/ dex2jar.bat/ jdgui/
    jquery 新手学习常见问题解决方法
    Linux系统中gb2312与utf8相互切换
    xml解析循环参数实例
    java 计算时间差
  • 原文地址:https://www.cnblogs.com/mujinjia/p/11205839.html
Copyright © 2020-2023  润新知