Java Web 编码问题一:jsp的编码问题

首先我们来看一张由eclipse生成的jsp文件的头:

图1:JSP文件编码

如上图所示jsp中的三个编码,

  1. ①代表的是服务器响应客户端请求的编码方式。服务器会用它来设置http响应头的content-type。就好比在Servlet中用response.setContentType("text/html;charset=utf-8")的作用。可以在浏览器的Header中响应头中的Content-Type中看到。
  2. ②pageEnconding的编码是值jsp文件本身被编码的编码格式。因为jsp最终会被编译成clss的字节码,而字节码是Unicode编码的,所以必须知道格式才能转换。如果没有设置,eclipse会按iso-8859-1的编码方式对其编码。如果1没有设置,那么就会使用2pageEncoding的编码来设置。
  3. ③中的content也是设置浏览器的解码格式的,但是它的优先级没有Header中的Content-Type优先级高,所以只要在Header中设置了Content-Type,那么就基本不会使用meta中的content了。

下面通过一个非常简单的例子来测试一下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>encoding</title>
</head>
<body>
<center>
<h4>您好!</h4> 
</center>
</body>
</html>

非常简单,运行没有乱码。用Firefox的debug看一下请求头如下:

图2:Header1

如果您有兴趣,可以尝试着把图1中①的编码contentType去掉,发现还是没有乱码,查看响应头信息,Content-Type的编码依然是utf-8,这是因为如果没有设置图1中①的编码contentType默认使用的就是图1中②pageEncoding的编码方式。

还可以尝试着把③中的编码改为iso-8859-1之类的与中文不兼容的编码,发现仍然没有乱码,查看请求头信息Content-Type的编码依然是utf-8,并且比meta中编码的优先级高所以浏览器还是使用响应头中的utf-8的方式来解码。

现在我们把中①的编码contentType编码改为GBK,如下图:

图3:contentType-GBK

在Firefox debug中查看请求头信息Content-Type的编码,发现Content-Type的编码是GBK这样证明①的编码contentType是设置响应头中的Content_Type。但是奇怪的是并没有产生乱码,服务器明明是utf-8编码,响应头是GBK为什么没有出现乱码呢?暂时无解。

但是我们把中①的编码contentType编码改为iso-8859-1不兼容中文的编码方式,发现就出现乱码了。

关于图3中没有出现乱码的原因,也许我们能够从浏览器的解码过程中找到一些提示,请参考:

www.w3.org/html/wg/drafts/html/master/syntax.html#parsing-with-a-known-character-encoding

时间: 2024-12-26 10:40:30

Java Web 编码问题一:jsp的编码问题的相关文章

java web中servlet、jsp、html 互相访问的路径问题。

在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendRedirect(path); 情况二.指向内部的web组件和本身有关系的,这一类我暂时看到的有:servlet或者jsp的转发 假设在myapp项目下有

Java web应用中的常见字符编码问题的解决方法

以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Content-Type: text/html; charset=UTF-8, 页面使用的就UTF-8编码. 但是考虑到离线的html(用户可能把页面html保存到本地), 打开离线的html的时候就要在meta指定编码,当然不指定也会有default值,那么不指定有时就可能出现乱码. Meta标签 <

Java Web基础小结之Jsp JavaBean

Java Web基础小结In computing, Java Web Start (also known as JavaWS, javaws or JAWS) is a framework developed by Sun Microsystems (now Oracle) that allows users to start application software for the Java Pl... http://bbs.chinaacc.com/forum-2-3/offset-1/to

Java Web学习(12):JSP九大内置对象(二)

接着来看JSP内置对象. response对象 response对象是javax.servlet.http.HttpServletResponse类的实例.当服务器创建request对象时会同时创建用 于响应这个客户端的response对象. response对象也定义了处理HTTP头模块的接口.通过这个对象,开发者们可以添加新的cookies,时间戳, HTTP状态码等等. response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它.response对象具有页面作用域,即 访

Java Web学习(10):JSP结构与生命周期

JSP结构 网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面.容器负责截获对JSP页面的请求.我们使用内嵌JSP容器的Apache来支持JSP开发. JSP容器与Web服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于JSP网页的特殊元素. 下图显示了JSP容器和JSP文件在Web应用中所处的位置. JSP处理 以下步骤表明了Web服务器是如何使用JSP来创建网页的: 1)就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器. 2)Web

Java Web学习(11):JSP九大内置对象(一)

在学习九大内置对象之前先来看看Web应用程序的请求响应模式. Web应用程序请求响应模式 Web应用程序的请求响应模式图示: 1)用户发送请求(request) 2)服务器给用户响应(response) 生活案例: JSP九大内置对象一览 JSP内置对象是Web容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明,也就是不使用 new关键字就可以使用的内置对象.JSP内置对象也被称为预定义变量. 九大内置对象为: 九个内置对象的简介见下表: out对象 out对象是javax.

Java Web学习(13):JSP九大内置对象(三)

application对象 什么是application? 服务器启动后就产生了这个application对象,当客户在所访问的网站的各个页面之间浏览时,这个application 对象都是同一个,直到服务器关闭.但是与session不同的是,所有客户的application对象都是同一个,即所有客户 共享这个内置的application对象. appliaction对象 application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.Se

Java Web学习(16):JSP动作元素(一)

一JSP动作元素概述 (1)JSP动作元素简介 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用.JSP动作元素是用XML语法写成的.利用JSP动作 可以动态地插入文件.重用JavaBean组件.把用户重定向到另外的页面.为Java插件生成HTML代码. JSP动作元素(action elements),动作元素为请求处理阶段提供信息.动作元素遵循XML元素的语法,有一个包 含元素名的开始标签,可以有属性.可选的内容.与开始标签匹配的结束标签. 动作元素只有一种语法,它符合XML标准

Java Web学习(17):JSP动作元素(二)

<jsp:include>动作元素 (1)<jsp:include>动作元素 <jsp:include>动作元素用来包含静态和动态的文件.该动作把指定文件插入正在生成的页面. <jsp:include>动作元素语法格式如下: <jsp:include page="相对URL地址" flush="true" />    前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而

Java Web学习(7):JSP基础语法

一个JSP页面可以被分为以下几部份: 1)静态数据,如HTML: 2)JSP指令,如include指令: 3)JSP脚本元素和变量: 4)JSP动作: 5)用户自定义标签: 一静态数据 静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致.此时,该JSP输入文件会是一个没有内嵌 Java或动作的HTML页面.而且,客户端每次请求都会得到相同的响应内容. 这个静态数据的本质就是HTML文档. 二JSP指令 JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令: (1)pag