zoukankan      html  css  js  c++  java
  • Servlet中request乱码问题解决

    乱码问题如下:

    String str=req.getParameter("wzName");
    System.out.println(str);

    上面使用get请求方式提交了一个wzNmae=水桶的参数值,在doGet中获取该参数值,并且打印到控制台,输出???,经过测试,发现我输入的“水桶”没有传过去的原因是浏览器访问它时,发生了汉字乱码问题。

    出现乱码的原因:

       前提知识:需要了解码表,编码,解码这三个名词的意思。我简单说一下常规的,

          码表:是一种规则,用来让我们看得懂的语言转换为电脑能够认识的语言的一种规则,有很多中码表,IS0-8859-1,GBK,UTF-8,UTF-16等一系列码表,比如GBK,UTF-8,UTF-16都可以标识一个汉字,而如果要标识英文,就可以用IS0-8859-1等别的码表。

          编码:将我们看得懂的语言转换为电脑能够认识的语言。这个过程就是编码的作用

          解码:将电脑认识的语言转换为我们能看得懂得语言。这个过程就是解码的作用

      浏览器使用的是UTF-8码表,通过http协议传输,http协议只支持IS0-8859-1,到了服务器,默认也是使用的是IS0-8859-1的码表。

      

      也就是三个过程,经历了两次编码,所以就需要进行两次解码,

          1、浏览器将"水桶"使用UTF-8码表进行编码(因为小明这个是汉字,所以使用能标识中文的码表,这也是我们可以在浏览器上可以手动设置的,如果使用了不能标识中文的码表,那么就将会出现乱码,因为码表中找不到中文对应的计算机符号,就可能会用??等其他符号表示),编码后得到的为 1234 ,将其通过http协议传输。

          2、在http协议传输,只能用ISO-8859-1码表中所代表的符号,所以会将我们原先的1234再次进行一次编码,这次使用的是ISO-8859-1,得到的为 ???? ,然后传输到服务器。

          3、服务器获取到该数据是经过了两次编码后得到的数据,所以必须跟原先编码的过程逆过来解码,先是UTF-8编码,然后在ISO-8859-1编码,那么解码的过程,就必须是先ISO-8859-1解码,然后在用UTF-8解码,这样就能够得到正确的数据。????.getBytes("ISO-8859-1");//第一次解码,转换为电脑能够识别的语言, new String(1234,"UTF-8");//第二次解码,转换为我们认识的语言

         String str1=req.getParameter("wzName");
            //直接打印,就会获得乱码,默认会使用ISO-8859-1编码进行解码
            //两次编码,却只进行一次解码
            System.out.println(str1);
            //分步
            //第一次解码
            byte[] bt=str1.getBytes("ISO-8859-1");
            //第二次解码
            String str2=new String(bt,"UTF-8");
            //正确输出
            System.out.println(str2);
            //一步
            String str3=new String(str1.getBytes("ISO-8859-1"),"UTF-8");
            System.out.println(str3);

    总结:

    get请求乱码经过了两次编码,所以就要两次解码

          第一次解码:xxx.getBytes("ISO-8859-1");得到yyy

          第二次解码:new String(yyy,"utf-8");

          连续写:new String(xxx.getBytes("ISO-8859-1"),"UTF-8");

  • 相关阅读:
    Mysql 基础
    Python Cdn平台文件md5验证
    Linux内存cache/buffer剖析
    wget
    UTV
    智能DNS解析之edns-client-subnet篇
    Python Django
    OpenSSL SNI
    Python 基础(一)
    Python ORM
  • 原文地址:https://www.cnblogs.com/FrankLiner/p/7878429.html
Copyright © 2011-2022 走看看