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");

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/FrankLiner/p/7878429.html
Copyright © 2011-2022 走看看