• Web实际应用中的编码问题


    一、 JSP页面有关编码的介绍

    ---->>假设不做不论什么设置,页面默认ISO-8859-1编码(Western European)。
    ---->><%@ page contentType="text/html; charset=UTF-8" %>

    等同于response.setContentType("text/html; charset=UTF-8"); 这里对ContentType进行说明下

    这里的ContentType是response的ContentType,意思就是告诉浏览器
    我的数据是text/html,编码是UTF-8,因此浏览器会以UTF-8的编码进行展示。

    ---->> <%@ page pageEncoding="UTF-8" %>

    1.等同于告诉Eclipse我这个页面以什么编码方式存储
    当然你能够改动jsp页面的编码方式,使其和pageEncoding不一样。
    Eclipse的编码有一个默认方式,叫determine from content type
    也就是说内容是怎么编的,我就怎么来。你要改动它也拿你没办法不是.
    2.同一时候告诉Tomcat以什么方式读取这个JSP页面(这里大家有疑问。我问候再解释)

    ---->>在<%@ page %>中假设没有contentType则依据pageEncoding产生contentType

    如果pageEncoding="UTF-8"则默觉得response.setContentType("text/html;charset=utf-8")
    如果pageEncoding="GBK"则默觉得response.setContentType("text/html;charset=gbj")

    ---->>在<%@ page %>中假设没有pageEncoding则依据contentType的charset来编码

    相同的假设没有pageEncoding则默认pageEncoding为contentType的charset.
    这里pageEncoding起的作用是告诉Tomcat这个JSP文件以什么编码读取。


    ---->><meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type" />
    ---->><meta charset="UTF-8" > 

    这两个是HTML标签。

    。假设response的header上没有ContentType。
    则浏览器会以这两个的编码进行展示.可是。看以下。

    。。


    在JSP中 假设<%@ page %> 没有contentType和pageEncoding。
    则默认response.setContentType("text/html")
    这就意味着默认编码是ISO-8859-1所以JSP中meta的charset和contentType无效。

    ---->>request.setCharacterEncoding("GBK");

    此方法是设置从浏览器端传过来数据的编码方式。


    注意该方法仅仅对POST的数据有效。

    ---->>resp.setContentType("application/json;charset=ISO-8859-1");

    此处的编码对于浏览器的编码无影响。即假设用的是中文,charset=UTF-8或者GBK
    对浏览器都不会产生乱码。

    仅仅要不是在中文的情况下使用ISO就能够.

    ---->>resp.setCharacterEncoding("GBK");

    这里的作用是设置返回给浏览器内容的编码方式,并能够设置页面的编码。


    前提是该请求是进行页面的跳转,假设是ajax请求数据,数据的编码方式则跟
    ajax请求发出的页面的编码方式同样。

    默认情况下页面是以ISO编码,假设数据中存在中文则默认改为GB2312,假设
    此时的编码方式为UTF-8。则会产生乱码。

    注意:在servlet中设置中文的编码和该servlet相应java文件保存的编码方式无关。

    二、 数据从server到浏览器的传输

    这里我先做一个简单的架构。A代表浏览器,B代表server(Tomcat)。
    B上面执行着很多Servlet.每个Servelt可能编码不一样。


    (这里Servlet的编码指的是Servlet的java文件在系统上的编码).
    每一个Servelt的编码事实上不影响他在服务浏览器时对编码产生的影响。
    这就好比两个不同编码的Servlet,当我们用文本打开时能够看到它们都拥有"中国"的字符
    它们在硬盘上保存的二进制可能是不同的,当它们对"中国"以UTF-8进行编码时产生的字节码是一样的

    在Tomcat看来JSP也是一个Servlet,比如我们有一个index.jsp则相应一个index_jsp.java。


    这里我不正确Tomcat的内部原理进行具体解释。大家仅仅要知道index_jsp.java是一个Servlet就可以。

    A请求B,B上的Servlet没有乱码,而且告诉A你应该以什么方式展示(ContentType)则没有乱码
    乱码最easy出现的地方是当我们訪问jsp的时候。大多数时候在index_jsp.java中已经是乱码了
    还记得我说过<%@ page pageEncoding="UTF-8" %>的两个作用,当中第二个作用是告诉Tomcat
    以什么方式读取jsp文件,也就是说pageEncoding的编码与实际index.jsp页面的编码一致时,
    生成的index_jsp.java文件中就没有乱码。有兴趣大家去看Tomcat源代码。


    注:
    contentType和pageEncoding的互相替代作用上面说过,不做解释了。


    当contentType和pageEncoding都有时,contentType为utf-8,pageEncoding为gbk
    而且index.jsp以gbk编码,也不会出现乱码.

    三、 数据从浏览器到server的传输

    数据从浏览器到server传输时。其编码方式以当前浏览器页面的编码方式同样。


    即页面是UTF-8编码就是UTF-8。是GBK就是GBK。


    在Serlvet中能够通过设置request.setCharacterEncoding("GBK");对数据进行解码。
    但这样的方式仅仅对通过post方式上传的数据有效。
    get方式的编码默觉得ISO-8859-1。
    get方式有两种情况:一种是在地址栏直接输入,还有一种是页面url跳转。以下分情况讨论下
    ------>>页面url跳转方式: 这里三种提供get方式乱码问题的解决的方法:
    1.在tomcat的server.xml中改动
    2.Serlvet中获取參数new String(request.getParameter("key").getBytes("ISO-8859-1"),"Encoding")
    另外一种方式在具体说明一下。在get方式发送请求时,是按页面的编码方式对数据进行编码。
    当请求发送到tomcat之后,会默认以ISO-8859-1的编码进行解码。

    因此我们须要以ISO的编码进行还原,
    在是页面的编码进行编码,所以这里的Encoding设置的是页面的编码方式。
    3.使用Tomcat8
    首先不建议get方式传中文,假设须要使用另外一种解决方案。
    ------>>地址栏直接输入:假设url带有中文则默认先UTF-8编码。再ISO-8859-1.
    与页面的url不同的是 页面的get方式编码取决于页面编码,地址栏浏览器默认utf-8.

    四、 温馨提示

    假设大家看Tomcat源代码,想了解jsp是怎样形成index_jsp.java文件的。
    建议大家看几个文件:Compile.java,Generator.java,PageInfo.java,ParserController.java

    以上我说的编码亲測有效,假设有什么出入的地方。欢迎交流。

    原创摘自:http://beadlechen.github.io/content/blog.html#category=software#article=encode3

  • 相关阅读:
    艾伟也谈项目管理,如何让网民爱上你的网站 狼人:
    Oracle2
    万源之源之drupal7
    万源之源之drupal 之 drupal_flush_all_caches
    JavaSocket客户端,服务端通信
    windows下的bat编写经验笔记
    百度音乐搜索不公开API
    重读《Agile Retrospective敏捷回顾》一书
    Binary Search Tree 二叉搜索树 C++
    MFC控件(4):List Box
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7105050.html
Copyright © 2020-2023  润新知