zoukankan      html  css  js  c++  java
  • 编码问题

    获取表单数据的时候,有这句代码request.setCharacterEncoding("UTF-8");,如果没有这句代码,会发生什么事呢?

    • 填写数据

    • 在服务器查看提交过来的数据,所有的中文数据都乱码了

     

    • 来这里我们来分析一下乱码的原因,Tomcat服务器默认编码是ISO 8859-1,而浏览器使用的是UTF-8编码。浏览器的中文数据提交给服务器,**Tomcat以ISO 8859-1编码对中文编码,当我在Servlet读取数据的时候,拿到的当然是乱码。**而我设置request的编码为UTF-8,乱码就解决了。

    • 接下来使用get方式传递中文数据,把表单的方式改成get即可

    • 当我们访问的时候,又出现乱码了!

    • 于是我按照上面的方式,把request对象设置编码为UTF-8试试
    
            request.setCharacterEncoding("UTF-8");
            String name = request.getParameter("name");
    
    
    • 结果还是乱码。这是为什么呢?我明明已经把编码设置成UTF-8了,按照post方式,乱码问题已经解决了!。我们来看看get和post方式的区别在哪?为什么post方式设置了request编码就可以解决乱码问题,而get方式不能呢。

    • 首先我们来看一下post方法是怎么进行参数传递的。当我们点击提交按钮的时候,数据封装进了Form Data中http请求中把实体主体带过去了【传输的数据称之为实体主体】,既然request对象封装了http请求,所以request对象可以解析到发送过来的数据,于是只要把编码设置成UTF-8就可以解决乱码问题了

    • 而get方式不同,它的数据是从消息行带过去的,没有封装到request对象里面,所以使用request设置编码是无效的。

    • 要解决get方式乱码问题也不难,我们既然知道Tomcat默认的编码是ISO 8859-1,那么get方式由消息体带过去给浏览器的时候肯定是用ISO 8859-1编码了
    
            //此时得到的数据已经是被ISO 8859-1编码后的字符串了,这个是乱码
            String name = request.getParameter("username");
    
            //乱码通过反向查ISO 8859-1得到原始的数据
            byte[] bytes = name.getBytes("ISO8859-1");
    
            //通过原始的数据,设置正确的码表,构建字符串
            String value = new String(bytes, "UTF-8");
    
    
    

    上面的代码有些难理解,图说明一下:

    • 经过我们手工转换,再来访问一下

    • 好的,成功解决掉乱码问题了。

    • 除了手工转换,get方式还可以改Tomcat服务器的配置来解决乱码,但是不推荐使用,这样不灵活。

    • 我们都知道Tomcat默认的编码是ISO 8859-1,如果在Tomcat服务器的配置下改成是UTF-8的编码,那么就解决服务器在解析数据的时候造成乱码问题了

    • 在8080端口的Connector上加入URIEncoding="utf-8",设置Tomcat的访问该端口时的编码为utf-8,从而解决乱码,这种改法是固定使用UTF-8编码的

    
        <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" URIEncoding="utf-8"/>
    
    
    • 设置了编码后,没有做任何手工转换,成功拿到数据

    • 当然也有另一种改服务器编码的方式。设置Tomcat的访问该端口时的编码为页面的编码,这种改法是随着页面的编码而变
        <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" useBodyEncodingForURI="true" />
    
    
    • 设置编码为UTF-8
    
            request.setCharacterEncoding("UTF-8");
            String name = request.getParameter("name");
    
    
    
    • 再次访问

    • 手写超链接如果附带中文参数问题,要URL重写,在JSP博客中会讲到

    • 总结:

    • post方式直接改request对象的编码

    • get方式需要手工转换编码

    • get方式也可以修改Tomcat服务器的编码,不推荐,因为会太依赖服务器了!

    • 提交数据能用post就用post

  • 相关阅读:
    多状态场景:后端只记录行为,不记录行为的含义,比如产品定义的状态值含义;行为是客观的,不变的。
    Golang协程池的使用 原创 360质量效能 360质量效能 2021-05-28
    &strct new
    【Golang】图解函数调用栈
    Mybatis-Plus的应用场景及注入SQL原理分析
    倒计时时间到触发事件
    浅析软件供应链攻击之包抢注低成本钓鱼
    腾讯代码安全指南开源,涉及C/C++、Go等六门编程语言 https://mp.weixin.qq.com/s/yzg5uVnoJDTyaH2Wn8Vo7w
    58黄页标签提取及海量多分类优化
    引用站点策略: strict-origin-when-cross-origin 引用站点策略: no-referrer-when-downgrade
  • 原文地址:https://www.cnblogs.com/wuxu/p/10983829.html
Copyright © 2011-2022 走看看