科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道WebLogic Server 国际化

WebLogic Server 国际化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

国际化概述 WebLogic Server 中 I18n 的主要特性: 在 WebLogic Server 内部,所有字符都按 Unicode 进行处理。只要输入或输出字符数据,就执行代码转换。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

Servlet 和 JSP

  1. Java 编码和 IANA 字符集之间的映射(在 weblogic.xml 中设置)

下列部分详细说明了 Servlet 和 JSP 的每个设置。

Servlet

指定 HTTP 响应的编码 - response.setContentType()

要为由 Servlet 生成的 HTML 页面指定编码,请使用 setContentType() 方法。对 setContentType() 的调用指定下列内容:

  • 用于响应的 HTTP 头中的 ContentType 特性
  • 用于输出响应的写入器编码

因此,在获得写入器之前,必须先调用 setContentType()。

res.setContentType("text/html;charset=GB2312");
PrintWriter out = res.getWriter();

该调用指定 HTTP 头中的 contentType。这意味着同时指定了浏览器显示的编码。

指定 HTTP 请求的编码 - request.setCharacterEncoding 或 <input-charset>

现在,您已经指定了 HTTP 响应(使用上述方法从 WebLogic Server 发送到客户端的数据)的编码设置。下面描述了在将数据从客户端发送到 WebLogic Server 时,如何设置 HTTP 请求的编码。

可通过三种方法指定 HTTP 请求的编码:

  • 将字符集写入 HTTP 请求的 contentType 中

    此方法最符合 HTTP 规范。但是,不能在 Microsoft Internet Explorer 或 Netscape 浏览器中指定该值。

  • 在服务器上指定 HTTP 请求的编码

    使用 request.setCharacterEncoding() 方法。可以指定每个请求的编码。还可以执行更细化的操作(如动态控制编码)。另外,setCharacterEncoding() 符合 Servlet 2.3 规范。因此,可以实现应用程序可移植性。

    		request.setCharacterEncoding("GB2312");
    		String pval = request.getParameter(pname);
  • 使用 Web 应用程序部署描述符 (weblogic.xml) 中的 <input-charset>,指定请求 URL 的编码。

    在 WebLogic Server 6.0 中,它在 web.xml 中进行设置。在 WebLogic Server 6.1 或更高版本中,它在 weblogic.xml 中进行设置。同时,元素名称等也进行了更改。因此,如果从 WebLogic Server 6.0 迁移,需要修改 weblogic.xml 和 web.xml 文件。

对于从客户端 Web 浏览器的请求 URL 中指定的资源,<input-charset> 的值确定该资源的路径在服务器端的编码。

示例:

  • Obtain http://localhost:7001/webappa/path1/ in UTF-8
  • Obtain http://localhost:7001/webappa/path2/ in GB2312

系统允许使用这些配置。

可以按如下所示描述 <input-charset>。目标 Web 应用程序的 <charset-params> 元素应当写在部署描述符 (weblogic.xml) 文件中。

在 <charset-params>(内嵌于 <weblogic-web-app>)中,写入要为其指定编码的请求 URL 路径,以及要为 HTTP 请求指定的编码(用 IANA 名称)。

有关 Java 编码名称和 IANA 字符集之间映射的信息,请参阅“Java 编码和 IANA 字符集之间的映射(在 weblogic.xml 中设置)”部分。

下面是一个处理多个编码的 Web 应用程序的示例。

在本例中,“/*”的编码设置为 UTF-8,“/rus/jo/*”的编码设置为 GB2312。

<charset-params>
  <input-charset>
    <resource-path>/*</resource-path>
    <java-charset-name>UTF-8</java-charset-name>
  </input-charset>
</charset-params>
<charset-params>
  <input-charset>
    <resource-path>/rus/joe/*</resource-path>
    <java-charset-name>GB2312</java-charset-name>
  </input-charset>
</charset-params>

有关此设置的详细信息,请参阅“Developing Web Applications for WebLogic Server”中的 charset-params。

JSP

指定 JSP 文件的编码 - pageEncoding(可选)

要指定 WebLogic Server JSP 容器或 JSP 编译器用来读取 JSP 文件的编码,请在 page 标记中指定 pageEncoding 指令,如下所示:

<%@ page contentType="text/html; charset=GB2312"  pageEncoding="GB2312" %>

指定页面输出的编码 - page 标记中的 contentType 指令

要指定页面输出的编码,请在 page 标记中指定 contentType 指令,如下所示:

<%@ page contentType="text/html; charset=GB2312" %>

另外,当您在 page 指令中指定 contentType 时,会在 HTTP 响应的 HTTP 头中指定同样的 contentType,这意味着同时指定了浏览器显示的编码。

如果未设置 pageEncoding 指令,会将 contentType 指令用作读取 JSP 文件的编码。

如果 JSP 容器找到 contentType 设置,会停止解析 JSP 文件,将文件读取器切换到这个新指定的编码,重新从头解析 JSP 页。如果在一个文件中指定了多个 contentType,就会出现解析错误。因此,使用静态包含将一个文件包含在另一个文件中时,如果这两个文件都有各自的编码规范,就会出现错误。在动态包含中,不会出现错误,但是将生成乱码字符。

注意:如果在一个文件中发现多个 contentType 实例,这两个实例都使用相同的值,则是有效的,不会导致解析错误。(有关详细信息,请参阅静态与动态包含以及编码差异)。

<jsp-param>
  <param-name>backwardCompatible</param-name>
  <param-value>true</param-value>
</jsp-param>

例如,当使用静态包含 (<%@ include) 执行包含操作时,如果“包含源”和“包含目标”都有各自的 page 指令,并且一个转换单元有多个 page 指令,则只要每个 page 指令都指定相同的编码,就不会发生任何问题。

指定 HTTP 请求的编码

可以像在 Servlet 中一样,在 JSP 中指定 HTTP 请求的编码。有关详细信息,请参阅 Servlet 部分。

<%
             request.setCharacterEncoding("GB2312");
             String pval = request.getParameter(pname);
         %>request.setCharacterEncoding or <input-charset>

Servlet 和 JSP

Java 编码与 IANA 字符集之间的映射(在 weblogic.xml 中设置)

在 page 标记中使用 setContentType() 方法或 contentType 指令指定编码时,请使用 IANA 字符集名称。但是,在 Java 应用程序 WebLogic Server 中处理这些编码时,这些值必须是 Java 编码名称。WebLogic Server 内部还有默认映射,通常情况下会使用默认映射。默认映射还包含 IANA 中未定义(但通常在 HTML 的 Content-Type 中使用)的映射。(请参阅 WebLogic Server 中定义的 MIME-Java 编码映射表。)

示例:x-sjis ----> Shift_JIS

可以根据自己的需要更改此映射。请按如下所示在 Web 应用程序部署描述符中设置映射。

例如,contentType 中的“Shift_JIS”设置在 WebLogic Server 中作为 SJIS 进行处理,这是因为 IANA 字符集“Shift_JIS”映射到 Java 编码“Shift_JIS”(在 JDK1.4 中,Shift_JIS 作为 SJIS 的别名使用)。

注意:在 Java 1.3 中,IANA 字符集 GB2312 作为 MS936 处理(从 JDK 1.1.8 到 JDK 1.4.0。在 JDK1.4.1 或更高版本中,Shift_JIS 作为 SJIS 处理)。

这样通过默认设置即可使用 MS932 特定的字符集(@ 等)。

为了分配和使用与默认映射不同的编码,请使用下列步骤覆盖默认映射。在 Web 应用程序的部署描述符 (weblogic.xml) 文件中配置 <charset-mapping> 元素。

在下面的示例中,Shift_JIS 映射到 MS932。

<charset-params>
  <charset-mapping>
    <iana-charset-name>Shift_JIS</iana-charset-name>
    <java-charset-name>MS932</java-charset-name>
  </charset-mapping>
</charset-params>

请注意,此设置不符合 J2EE。在 WebLogic Server 6.0 中,它在 web.xml 中进行设置。在 WebLogic Server 6.1 或更高版本中,它已经更改为在 Web 应用程序部署描述符 weblogic.xml 中进行设置。同时,元素名称等也进行了更改。因此,如果从 WebLogic Server 6.0 迁移,需要修改 weblogic.xml 和 web.xml 文件。

使用 ISO-8859-1 编码对 HTTP 请求进行编码的方法

如果在 <input-charset> 中将 ISO-8859-1 指定为 HTTP 请求的编码,您仍可以使用下列方法获取具有另一编码的 HTTP 请求。

示例:

new String(request.getParameter(itemQ[i]).getBytes ("8859_1"), "GB2312")

但是,如果 HTTP 客户端用于 HTTP 响应的 HTTP 头中的 contentType 按如下方式指定,则该 HTTP 客户端不能使用此方法。这是因为 HTTP 头中的 contentType 中指定的编码优先于 <input-charset> 中指定的编码。在这种情况下,必须修改应用程序代码。

Content-Type:application/x-www-form-urlencoded;charset=gb2312

静态与动态包含以及编码差异

静态包含

<%@ include file="relativeURL" %>

在这种情况下,在执行 JSP 编译之前,将在一个文件中加载和收集所有包含文件。在 WebLogic Server 6.1 或更早版本中,如果在执行包含操作的文件中指定编码,则被包含的文件将作为编码与包含文件相同的文件进行处理(即使尚未指定其编码)。在 WebLogic Server 8.1 中,如果它们有各自的 page 指令,则会出现编译错误。要避免此问题,请将 weblogic.xml 中的“backwardCompatible”设置为 True。

如果“包含源”与“包含目标”的编码设置不同,则会出现 JSP 编译错误。

动态包含

<jsp:include page="{ relativeURL | <%= expression %>}" flush="true" />

如果使用 jsp:include,加载页面时不会包含此页面,而是留在标记状态中。当执行 JSP 时将包含此页面。因此,执行包含操作的 JSP 中设置的编码不会应用于被包含的文件。

因此,还必须在被包含的文件中指定编码。

 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章