一、 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

Web实际应用中的编码问题的更多相关文章

  1. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  2. Java web中常见编码乱码问题(一)

    最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...

  3. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  4. 深入分析Java Web中的编码问题

    编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...

  5. web.xml 中以编码方式添加filter并设置初始化参数AbstractAnnotationConfigDispatchServletInitializer

    web.xml中配置filter <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  6. web前端学习(一) j2ee环境搭配+jsp中的编码问题

    jsp中的编码问题 pageEncoding是jsp文件本身的编码  contentType的charset是指服务器发送给客户端时的内容编码 我安装tomcat的方法是 安装j2ee的eclipse ...

  7. Web Service 的创建简单编码、发布和部署

    最近,老大准备将已有的C/S架构项目中的通信部分做成通用,需要将其支持WebService为以后项目向着B/S架构升级做好铺垫,为此身为屌丝的我去各种百度WebService是个什么卵玩意,然后逐渐搭 ...

  8. 理清Java中的编码解码转换

    1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...

  9. JS中URL编码参数(UrlEncode)

    JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...

随机推荐

  1. VS2015环境配置: VS2015 未能正确加载“ResourceManagerPackage”包的问题

    启动vs2015专业版时,出现类似于这样的提示框,有好几个,点击是或否,但下次打开还是会出现.笔者也寻找了网上的一些解决办法,例如用vs命令窗口或其他,但都无疾而终,下面提供的这个办法,顺利解决此问题 ...

  2. Select2插件ajax方式加载数据并刷新页面数据回显

    今天在优化项目当中,有个要在下拉框中搜索数据的需求:最后选择使用selec2进行开发: 官网:http://select2.github.io/ 演示: 准备工作: 文件需要引入select2.ful ...

  3. lua_string_pattern

    两大特点: 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个新的字符串. 库函 ...

  4. js 学习笔记---基本概念

    早已接触javascript多年之后,竟然还有这些概念混淆不清,毫不知情,说出来真实无地自容 ! 1.使用严格模式,"use strict",虽然不适用,但是要知道,以免别人使用时 ...

  5. JavaScript定时器及其他

    By Abyssly Jun 20 2014 Updated:Jun 20 2014 平时工作中不可避免地要嵌套网页,对JavaScript的深入了解还是很有必要滴.而JavaScript中一个容易让 ...

  6. Python语言之函数

    1.函数的定义与调用 def function(x): print("function(%s)"%x) function("hello") #call the ...

  7. mysql_数据查询_单表查询

    1.单表查询: 1.1选中表中若干列: SELECT子句的<目标列表达式>可以是表中属性列,也可以是表达式,还可以是字符常量. SELECT Sname,'year of birth:', ...

  8. CDR服装设计-用CorelDRAW排钻如何把圈摆均匀

    服装设计一直都是一个很火热的行业,也是一个比较高端的行业,随着时代的步伐,以前的人都是用手绘的方式来设计服装,现在不一样了,电脑可以说普及到了每一个家庭,让软件以更快的速度,更准确的数据来设计服装中的 ...

  9. 用 ilasm 反编译、修改.net dll文件

    有些.net dll我们没有源码,如果要修改某些东西,可以用ilasm.exe反编译为il代码,修改后再编译回dll ilasm通常放在以下路径 C:\Windows\Microsoft.NET\Fr ...

  10. linux强制踢出已登录的用户及本地用户

    方法一: pkill -kill -t pts/0 方法二: fuser -k /dev/pts/0 你也可以给他发送关闭信息然后关闭 echo "你被管理员踢出了" > / ...