`

JSP页面编码问题研究

阅读更多

问题

 

曾经有一个网友问过我这样一个问题:

<%@page contentType="text/html; charset=UTF-8"%>

<html>

<head>

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

</head>

<body>

中国

</body>

</html>

这个页面在为什么在运行的时候“中国”会变成乱码?

关键步骤

 对于上面问题的分析需要从整个JSP页面请求的生命周期来看,一般的都需要经历下面几个阶段:

1、应用服务器根据JSP页面生成一个Java文件

2、应用服务器调用java.exeJava文件编译成一个Servlet对应的class文件

3、用户的浏览器请求JSP对应的ServletWeb容器起一个线程执行Servlet,将数据返回给客户端浏览器

4、用户的IE根据返回的数据,将结果显示给用户。

关键步骤分析

为了更好的了解编码问题,我们暂时先从上面的四个环节一步步来分析,根据分析的结果,来得到最终的解决办法。

1 在应用服务器根据JSP页面生成Java文件阶段。

 

应用服务器会将整个JSP页面的代码读取出来,然后写到一个新的JAVA文件中,在读文件和写文件的时候都牵涉到一个编码问题,这个编码问题应用服务器是如何解决的呢?我研究Tomcat应用服务器的源代码,发现Tomcat中有一个pageEncoding参数非常重要,在ParserController会从JSP文件中读出这个参数(如果没有读到,就从第一行的contentType中读取charset),然后保存起来,如果没有读取到这个参数,会从JspConfig中读出一个默认的PageEncoding参数,如果这两个参数都没有的设置,系统会默认成ISO8859-1的编码来读取原来的JSP文件

   从上面的分析出,我们已经基本了解了应用服务器读取JSP文件的编码方式,由于Java底层都是基于Unicode编码来存储字符的,所以生成Servlet的Java类文件的时候,都输出成UTF-8编码的形式

2JDKJava文件编译成Class文件的时候

可以利用-encoding参数指定源文件的编码,这在手动编译的时候非常重要,因为这决定了Java虚拟机读取Java文件时采用的编码方式,但是在Web应用中这个环节我们可以忽略,因为应用服务器可以很好的解决这个编码。以Tomcat为例,由于生成的java文件是固定的UTF-8编码,所以Tomcat也固定的采用UTF-8编码来读取,通过浏览AbstractCatalinaTask可以看到reader = new InputStreamReader(hconn.getInputStream(), CHARSET);其中的CHARSET=utf-8。所以在这个环节中应用服务器都可以很好的把握,不会带来编码问题。

3 用户的浏览器请求JSP对应的Servlet阶段。

 

如果前面的环节中不会带来编码问题,也就是说在Java虚拟机中运行的时候,能正常的获取到“中国”,那么在执行servlet的环节中“中国”始终是以Unicode存储的中国,那么在第三个环节中需要关注的是JspWriter如何将数据返回给客户端浏览器。大家可以试验一下,java中如果用new String(str.getBytes("encoding"),"encoding")执行的时候,始终不会出现乱码问题,也就是说,一个字符串可以用不同的代码来getBytes()生成字节数组(底层I18N.jar所作的工作,提供Byte2CharChar2Byte的转换)。

   如果大家可以理解这一点,那么下面大家就需要了解JspWriter输出字符串时采用的编码方式是什么?通过浏览Response.java类可以了解到Tomcat应用服务器是根据contentType来获取的writer的编码方式,也就是说,最后返回客户端的字节流是contentType对应的charset中获取出来的字节数组

4 IE根据返回的数据处理显示阶段

 

通过前面的分析可以了解到,应用服务器返回的“中国”是根据ContentType中的charset来显示并输出到客户端的,只要IE知道该用这个编码来接收字节流并转成字符串,并将用户的浏览器推荐合适的编码来查看结果,用户就可以浏览到正确的“中国”两个字。可以高兴得是,目前的IE等浏览器正式这样处理的。

结论

通过上面的分析,我们可以看到,在整个JSP页面的编码过程中,我们真正要解决的是JSP文件到Java文件这个过程中的编码问题,也就是PageEncoding参数的设置问题。由于pageEncoding参数是servlet2.3规范中规定的参数,所以下面的方法在很多应用服务器下面都通用,这方面的设置本人在工作中基本上得到了下面的一些方法:

1。在JSP页面的中加上pageEncoding参数,比如:<%@ page contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>,这样就可以将页面可以用ANSI来存储。也就是说当页面存储的编码方式和chtentType中的charset不一样的时候,可以考虑加上pageEncoding参数。

2。有些应用服务器(如weblogic),在没有获取到pageEncoding参数的时候,不是先从charset中获取编码类型,而是从另外的一些配置文件,如weblogic.xml文件中加上下面的代码:

<jsp-descriptor>

     <jsp-param>

          <param-name>compilerSupports</param-name>

          <param-value>true</param-value>

     </jsp-param>

     <jsp-param>

          <param-name>encoding</param-name>

          <param-value>GBK</param-value>

     </jsp-param>

</jsp-descriptor>

(在Tomcat5X种也有类似的处理,在应用的web.xml文件中加上类似下面的配置项)

</jsp-config>

<jsp-property-group>

           <url-pattern>*.jsp</url-pattern>

           <el-ignored>true</el-ignored>

</jsp-property-group>

</jsp-config>

 

以上是对JSP页面编码的一些分析和处理方法,希望能对大家今后的学习和工作中有帮助!

分享到:
评论

相关推荐

    解决jsp页面中文乱码问题

    1. **JSP页面编码设置** JSP页面默认的编码可能与我们的实际需求不符,特别是在处理中文字符时。可以通过以下方式设置JSP页面的编码: - 在JSP文件顶部添加`;charset=UTF-8" language="java" %&gt;`指令,指定页面的...

    有关JSP页面乱码问题的解决

    本文将深入探讨JSP页面中可能出现的乱码问题及其解决方案,并针对不同场景下的乱码现象提供具体的应对策略。 #### 1. JSP页面本身的乱码问题 JSP页面乱码通常发生在页面显示或表单提交过程中。解决这类问题的关键...

    jsp乱码解决方案 本方案解决了jsp常见的乱码问题

    - **设置JSP页面编码**:在JSP页面头部添加`; charset=UTF-8" pageEncoding="UTF-8"%&gt;`,确保页面使用统一的编码格式。 - **设置Tomcat服务器编码**:修改Tomcat配置文件中的`URIEncoding`属性为“UTF-8”,以确保...

    jsp页面显示中文乱码解决.rar

    本主题聚焦于“jsp页面显示中文乱码解决”,这是一个典型的问题,许多开发者在处理包含中文字符的JSP页面时可能会遇到。让我们深入探讨这个问题,并提供一系列解决方案。 1. **字符编码基础** - **字符集与编码**...

    怎么解决JSP页面中文问题20100901

    本文将详细探讨如何有效地解决JSP页面中的中文问题,确保用户界面能够正确地显示中文内容。 #### JSP页面中文问题的根本原因 在JSP页面中出现中文乱码的原因主要有以下几个方面: 1. **文件存储编码不一致**:JSP...

    JSP中文乱码问题解决总结

    2. 设置JSP页面编码:在JSP页面头部使用`;charset=UTF-8" %&gt;`指令,确保页面以UTF-8编码输出。 3. 调整编辑器设置:确保开发工具(如IDEA、Eclipse等)的编码设置为UTF-8,避免源代码乱码。 4. 处理请求参数:在...

    Struts2资源文件在jsp页面中显示乱码解决

    该插件不仅能解决properties文件在编辑器中的乱码问题,还能确保JSP页面正确显示资源文件中的内容,而无需手动编码转换。 安装步骤如下: 1. 在Eclipse中,依次选择`Help` &gt; `Software Updates` &gt; `Find and ...

    JSP页面传参出现中文乱码的解决方案

    - **设置JSP页面编码**:在JSP页面的头部使用`;charset=UTF-8" %&gt;`来指定页面的编码为UTF-8。 - **设置Servlet接收参数编码**:在Servlet中,通过`request.setCharacterEncoding("UTF-8")`来设定请求的字符编码,...

    web项目乱码问题 jsp乱码问题解决

    2. 设置JSP页面编码:在JSP文件顶部使用`&lt;%@ page pageEncoding="UTF-8"%&gt;`声明页面编码。 3. 设置HTTP响应头:确保服务器响应的Content-Type头中的charset与JSP页面编码一致,例如`Content-Type: text/html;charset...

    jsp页面乱码处理

    3. **页面编码设置**:如果JSP页面本身的编码设置不正确或者未设置,则在显示中文时可能出现乱码现象。 4. **数据库连接配置**:连接数据库时没有指定正确的字符集编码,可能导致从数据库读取的数据出现乱码。 ####...

    JSP中文乱码问题解决办法

    在处理数据库中的中文数据时,无论是读取还是写入,都需要保证数据库、JSP页面和Java代码之间的编码一致性,这样才能避免乱码问题。 总的来说,解决JSP中文乱码问题的关键在于理解字符编码的工作原理,以及在各个...

    jsp页面调用js,弹出信息乱码

    在JSP页面中调用JavaScript进行弹窗提示时出现乱码问题是一种常见的现象。这种情况通常发生在需要显示中文或其他非ASCII字符的情况下。本篇文章将深入探讨该问题的原因,并提供一系列解决方案。 #### 代码示例分析 ...

    如何解决MySql-JSP中文乱码问题

    这个问题的出现主要是由于字符编码不一致导致的,包括数据库编码、连接编码、页面编码等多个环节。下面我们将深入探讨如何解决这一问题。 首先,确保MySQL数据库本身的编码设置正确。MySQL通常推荐使用`utf8mb4`...

    JSP编码以及乱码问题解疑

    当JSP页面显示乱码时,通常是因为页面编码不一致导致的。页面的编码设置应保持一致,确保从文件存储、内容解码到浏览器解析的整个流程中,字符集相同。以下三个关键位置需要关注: - **文件存储编码**:JSP文件在...

    解决JSP中文乱码问题

    总的来说,解决JSP中文乱码问题的关键在于确保整个流程中的编码一致性,包括源文件编码、编译过程中的编码、JSP页面声明的编码以及HTTP请求和响应中的编码。通过理解这些环节,并针对性地调整,可以有效地避免和解决...

    jsp中文乱码的解决方案

    #### 2.1 JSP页面编码设置 在JSP页面顶部添加以下指令,指定页面编码为UTF-8: ```jsp ;charset=UTF-8" language="java" %&gt; ``` #### 2.2 HTTP请求编码处理 在Servlet或Filter中获取请求参数时,先设置请求的...

    java中文乱码解决之道(7)JSP页面编码过程Java开

    这篇"java中文乱码解决之道(7)JSP页面编码过程"的主题深入探讨了如何有效地解决这个问题,提供了宝贵的Java经验和技巧。这里我们将详细解析JSP页面编码过程中的关键点,以及如何避免和解决中文乱码。 首先,理解...

    WEB页面乱码研究问题

    ### WEB页面乱码研究问题 #### 重要知识点详解 **一、中文乱码问题的根源** 中文乱码问题,尤其是在动态网页(如JSP)中,是开发人员常常遭遇的难题。这一问题的核心在于多种字符编码机制的共存。Web页面的乱码...

    编码过滤通用类,解决jsp页面的乱码问题

    本篇将详细探讨"编码过滤通用类",以及如何使用它来解决JSP页面的乱码问题。 首先,让我们了解什么是乱码问题。在Web开发中,当文本在不同的字符编码之间不正确地转换时,就会出现乱码。常见的例子是,服务器使用...

Global site tag (gtag.js) - Google Analytics