zoukankan      html  css  js  c++  java
  • response和request的setCharacterEncoding区别

    一、request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值。

        指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,Java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。

    get需在Tomcat的server.xml中的:

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

    URIEncoding="GBK" />

    )加入URIEncoding="GBK",解决get请求乱码问题

    客户端编码后,用该方法告知服务端,解码时使用相同的编码格式,否则会出现乱码。客户端一般编码()设置

    <meta http-equiv="Content-Type" content="text/html; charset=gbk">    (post提交的form表单参数采用meta编码方式)

    二、response.setContentType("text/html;charset=gb2312")是设置页面中为中文编码。(get中的QueryString参数用response中的contentType编码,如果没有采用meta编码)

        前者是设置动态文字(参数,数据库),后者设置页面静态文字
    response.setContentType指定 HTTP 响应的编码,同时指定了浏览器显示的编码. 
    response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置.与response.setContentType相同的是,调用此方法,必须在getWriter执行之前或者response被提交之前.

    该方法是指定服务端编码格式,并告知客户端解码时的编码码格式,这样两者保持一致,才不会出现乱码。


    三、post表单和get queryString编码设置

    实践证明queryString只配置URIEncoding就可以,如果是pathInfo就需要配置useBodyEncodingForURI。关于queryString的编码有如下阐述:(引自http://blog.csdn.net/sfdev/article/details/3841719

    对于Get方式的URL请求有两种情况,其一:用户直接在浏览器地址栏中输入URL,此时浏览器没有编码可参考,直接用浏览器的默认编码进行解析并提交到服务端;其二:在form表单内提交,只是form属性method为GET,此时浏览器会参考目前html中对编码的相关设置进行解析,比如content-type或meta中的charset。

    以下就重点讲讲第二种方式的提交:
    GET方式form submit:浏览器会对URL进行URL encoding,然后发送给服务器。

    • 对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo在URL Encoding时按照UTF-8编码;QueryString按照GBK编码。
      此时提交是:GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA
    • 对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString在URL encoding时按照GBK编码。
      此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
    • 对于中文firefox、Chrome,因为没有类似IE中的这种设置选项,所以这两种浏览器中对pathInfo的编码规则没有做特殊处理,MS是和queryString采取同样的编码规则;在本例中的假设情况下:pathInfo和queryString在URL encoding时都按照GBK编码。
      此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA

    很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码,该编码可能不会由我们应用来控制;对于queryString,则是可以由我们的应用来完全控制的,对于上面的事例:中文的IE和FIREFOX都是采用GBK编码queryString。

    若调整下上例中的假设条件,设置Html内content-type或meta中的charset=UTF-8
    此时在IE中queryString会按照UTF-8进行编码,即name=%E4%B8%AD%E5%9B%BD;
    但是在非IE(Firefox、Chrome)中,此时提交时URL中会以中文直接提交,即name=中文;此时服务端的web服务器上肯定要进行相应的编码配置,否则肯定会出现乱码;

    若设置Html内content-type或meta中的charset=ISO-5899-1
    此时在IE、Firefox、Chrome中queryString都被用ISO-5899-1编码了,即name= %26%2320013%3B%26%2322269%3B;



  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/fan-xiaofan/p/6028233.html
Copyright © 2011-2022 走看看