跳到导航
dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare
在多字节环境中使用
    下一页   目录

WebLogic Server 8.1 SP4 的注意事项

以下部分介绍在多字节环境(如日语、中文和朝鲜语)中使用 WebLogic Server 8.1 SP4 的注意事项,以及自从发行此版本以来的已知问题和已解决问题。

 


WebLogic Server 8.1 SP4 的注意事项

在 AIX 上运行 WebLogic Server SP03 时使用 ISO-2022-JP 编码的注意事项 (CR131694)

在 AIX 中运行安装有 IBM JDK1.4.2 的 WebLogic Server (SP3) 时,JSP 日语输出中的日语 ISO-2022-JP 编码需要修补程序。有关如何获取修补程序的信息,请与客户支持联系。

在管理控制台的首选项中添加语言设置 (CR173345)

已在 WebLogic Server 8.1 SP3 的管理控制台首选项中添加了语言选项。下面列出了 SP3 的选项。
	简体中文/GB18030
	简体中文/GB2312
	简体中文/GBK
	简体中文/UTF-8
	繁体中文/Big5 
	繁体中文/Big5-HKSCS 
	繁体中文/UTF-8 
	英语 
	英语/UTF-8
	日语/EUC-JP 
	日语/Shift_JIS
	日语/UTF-8
	朝鲜语/EUC-KR
	朝鲜语/UTF-8
	

包含多字节字符的用户登录到管理控制台 (CR171053)

在 WebLogic Server 8.1 SP3 中,包含多字节字符的用户名可以登录到管理控制台。

BEA Oracle Driver (Type 4) 的“codePageOverride”属性 (CR130056)

自 WebLogic Server 8.1 SP3 之后,已经添加了 BEA Oracle Driver (Type 4) 的“codePageOverride”属性。此属性会影响那些映射为 Unicode 的符号的处理,如 `(波形破折号)和 ¢(分币符号),这不同于 MS932 编码和其他转换器。通过设置此属性,驱动程序可以按如下方式处理这些符号。

codePageOverride - 对于 SJIS: 会正确处理由 SJIS 转换器映射的代码,但是不能保证会正确处理由 MS932 转换器映射的代码。

codePageOverride - 对于 MS932:会正确处理由 MS932 转换器映射的代码,但是不能保证会正确处理由 SJIS 转换器映射的代码。

在 Sun JDK 1.4.2_04 中使用 ISO-2022-JP 编码的问题

在由 SP3 处理的 Sun JDK 1.4.2_04 或 JRockit8.1SP3 中使用 ISO-2022-JP 编码时,有时会发生 java.nio.BufferOverflowException。这是一个 Sun JDK 缺陷,该缺陷已经在 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5017922 中报告。如果要使用 ISO-2022-JP 编码,则应使用 Sun JDK 1.4.2_05、JRockit VM 的兼容版本或处理这些内容的 SP4。
	 (补充)具体而言,在使用以下代码时会出现异常。

		byte[] b = "[1] ".getBytes("ISO-2022-JP");

基于表单的身份验证的输入编码规范 (CR123333)(不遵从 J2EE)

自 SP2 之后,可以为表单中基于表单的身份验证指定输入编码。将下面使用的编码名指定为 j_character_encoding。此函数在 J2EE 规范中不存在,它是 WebLogic Server 的初始函数之一。

      < form method="POST" action="j_security_check" >


      Username: <input type="text" name="j_username">


      Password: <input type="password" name="j_password">


      <input type="hidden" name="j_character_encoding" value="Shift_JIS">


      <input type="submit" value="Login">


      <input type="reset" value="Reset">


      </form>


SOAP 消息中附加的 XML 编码

在 Web Service SOAP 消息中附加 XML(javax.xml.transform.Source 对象)时,可以在 XML 头中指定可选编码。但是,当您收到消息并检索附加的 XML 数据时,头编码为 UTF-8。

安装到 UNIX 时使用的区域

使用日语版的安装程序时,请将用于启动安装程序的命令外壳的区域更改为 Shift_JIS。如果 EUC-JP、UTF-8、C 等使用 Shift_JIS 之外的其他区域,则样例代码中包含的日语文本文件将无法正确安装。使用朝鲜语、简体中文或繁体中文版的安装程序时,请将用于启动安装程序的命令外壳的区域更改为与所使用的语言相对应的区域。

安装时,请在以下区域环境下启动安装程序。

日语:
Solaris:ja_JP.PCK
HP:ja_JP.SJIS
Linux:ja_JP.SJIS

示例:

$ setenv LANG ja_JP.SJIS

例如,如果在所使用的 Linux 环境下不能使用 SJIS 区域(也就是说,即使运行 locale -a,ja_JP.SJIS 也不存在),则请通过以下步骤准备区域设置。
# su
# localedef -f SJIS -i ja_JP ja_JP.SJIS

在 JDK1.4.1 或更高版本中更改“Shift_JIS”编码的别名。

在 JDK1.4.1 中,“Shift_JIS”编码作为“SJIS”编码进行处理。

WebLogic Server 8.1 SP1 及更高版本的 Service Pack 使用 JDK1.4.1 或更高版本,并会影响 Shift_JIS 区域。在 WebLogic Server 7.0 及以前的版本使用的 JDK(JDK1.3) 中,“Shift_JIS”Java 编码名的别名是“MS932”。

对于 WebLogicServer 系统中的 IANA-Java 映射,IANA 字符集名“Shift_JIS”作为 Java 编码名 Shift_JIS 进行处理。因此,在 JSP、Servlet 或 Web Service 使用 Shift_JIS 时,其操作将与以前版本不同。例如,MS932 专有字符(“@”等)将变为“?”。因此,如果希望一如既往地使用 MS932,则应当使用 IANA 名称“Windows-31j”。要使用 MS932,请采用下面的方法 1 或 2。

方法 1 --- 重写 JSP/Servlet 的程序文件。

  1. --- 对于 JSP,在 page 标记中将 Shift_JIS 重写为 Windows-31J。

    示例:

    当 JSP 中存在以下行且使用 MS932 字符时,请将

    <%@ page contentType="text/html; CHARSET=Shift_JIS" %>

    重写为:

    <%@ page contentType="text/html; CHARSET=Windows-31J" %>

  2. --- 在 Servlet 中更改 setContentType() 的规范。

    对于 Servlet,当存在以下规范且使用 MS932 字符时,请将

    response.setContentType("text/html;charset=Shift_JIS");

    重写为:

    response.setContentType("text/html;charset=Windows-31J");


“Windows-31J”是在 IANA 中正式注册的字符集名称,等同于 Microsoft 代码页 932。在 Java 中,MS932 等同于 Microsoft 代码页 932。因此,Java 中的“MS932”便是 IANA 的“Windows-31J”。实际上在 Java 中,“Windows-31J”也是 MS932 的别名。就目前而言,保持 Java 编码名与 IANA 名称的一致渐成趋势。如果将来希望使用对应于 Microsoft 代码页 932 的字符集,则强烈建议使用“Windows-31J”。

方法 2 --- 在 weblogic.xml 中更改映射(不遵从 J2EE)

在 weblogic.xml 部署描述符文件中,可以将 IANA 名称 Shift_JIS 强制映射为 Java 名称 Windows-31J。这样,您可以不必重写 JSP 或 Servlet 代码,便能够将 Shift_JIS 作为 Windows-31J 进行处理。请在 weblogic.xml 中包括以下项,然后重新部署 Web 应用程序。

代码列表 1-1:weblogic.xml

<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application
8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
  <charset-params>
    <charset-mapping>
      <iana-charset-name>Shift_JIS</iana-charset-name>
      <java-charset-name>Windows-31J</java-charset-name>
    </charset-mapping>
  </charset-params>
</weblogic-web-app>

但是,这种方法是 WebLogic Server 特有的,不遵从 J2EE。换句话说,它不能与其他 J2EE Servlet 容器交互操作。而且,由于 IANA 名称“Shift_JIS”完全等同于 JIS X 0201 + JIS X 0208 字符集,因此,将“Shift_JIS”作为 Microsoft 代码页 932 使用是不恰当的。只有当出于某种原因难以修改 JSP 或 Servlet 代码时,才应使用这种方法。

全局字符集映射

在 WebLogicServer 8.1 中,可以使用全局 IANA-Java 字符集映射。直到现在,还特意保留了许多组件,以便将 IANA 字符集名称映射到 Java 编码名称。将这些名称汇集在一起可以保持一致性,即使在跨组件执行 IANA 名称与 Java 名称之间的映射时也是如此。

遵从 SOAP 1.2 媒体类型

在 SOAP1.2 的 HTTP SOAP 消息中使用的媒体类型是“application/soap+xml”。其操作与已在 SOAP1.1 中使用过的“text/xml”媒体类型的操作基本相同,但是,如果未在 HTTP 头的 contentType 中指定字符集,其操作会有所不同。

[HTTP,未指定 contentType 字符集]

SOAP1.1:

默认字符集是 us-ascii。在 XML 头中指定的编码将被忽略。在 WebLogic Server 8.1 中,SOAP1.1 消息遵从 RFC2376,因此该编码可被处理。

SOAP1.2:

在 XML 头中指定的编码有效。如果未在 XML 头中指定编码,则默认字符集为 UTF-8。在 WebLogic Server 8.1 中,SOAP 1.2 消息遵从 RFC3023,因此该编码可被处理。

WebLogic Server 生成的 SOAP 消息的编码规范

WebLogic Server 生成 SOAP 消息时,默认字符编码为 UTF-8。在 WebLogic Server 8.1 中,可以根据所使用的环境为生成的 SOAP 消息指定编码。

指定编码的方法有三种:第一种方法是为由 Web Service 强制生成的消息确定编码;第二种方法是在客户端 HTTP 请求的 HTTP 头中指定“Accept-Charset”参数,并针对该请求生成编码;第三种方法是在服务器启动时指定默认编码。

为生成的 SOAP 消息指定编码的方法

  1. web-service.xml 部署描述符的 charset 特性
  2. 客户端 HTTP 请求中的 Accept-Charset
  3. -Dweblogic.webservice.i18n.charset

注意: 服务器默认编码为 UTF-8

有关详细信息,请参阅 webservice 中的“国际化”项。

http://e-docs.bea.com/wls/docs81/webserv/i18n.html

在 URL 中使用多字节字符 (CR092089)

通过 servlet 容器(Web 容器),现在可以在 URL 中使用多字节字符。根据所使用的用户代理(Web 浏览器等),可以根据需要对服务器进行设置。

例如,如果收到以下类型的 HTTP 请求,
http://myHostName:port/myContextPath/myRequest/?myRequestParameter

myContextPath 和 myRequest 部分将按如下进行处理。

注意: myRequestParameter 部分位于 URL 后面,可以通过指定为 Servlet 的 setCharacterEncoding() 的编码或指定为 weblogic.xml 的 input-charset 的编码进行解码。对于 myHostName 部分,建议采用符合 IESG 标准的国际域名。

默认操作(通过基于 UTF-8 的编码进行 URL 解码)

如果未进行任何设置,WebLogic Server 8.1 将按如下方式处理请求。

  1. 对 myContextPath 和 myRequest 部分的 URL 进行解码
  2. 解码为 UTF-8 字符串,并生成在步骤 1) 中获取的字节流的字符串

例如,如果用户代理(Web 浏览器)是 MS IE (Microsoft Internet Explorer),则默认情况下,在地址栏中输入的多字节字符将首先编码为 UTF-8,然后进行 URL 编码。在 WebLogic Server 8.1 中,默认情况下,可以正确生成以 UTF-8 编码方式发送的此 URL 的字符串。

注意: 在 IE 的“Internet 选项”-->“高级”中,包含一个名为“总是以 UTF-8 发送 URL(需要重启动)”的选项,而且此选项必须处于启用状态(选中)。

对 URL 进行解码时指定字符编码的方法

当用户代理是 Netscape 时

如果用户代理是 Netscape,地址栏中的字符将按照 Netscape 运行环境中的字符集进行编码,然后,该字符串再次进行 URL 编码,并被发送到服务器。例如,在日语版 Windows 中编码为 Windows-31J 的字符串将进行 URL 编码。在 WebLogic Server 8.1 中,可以将此请求设置为在进行 URL 解码之后将字节流解码为 Windows-31J,从而正确接收此请求。通过下面的 WebLogicServer 启动选项,可以更改用于执行 URL 解码的编码方式。

-Dweblogic.http.URIDecodeEncoding=Windows-31J(默认值为 UTF-8)

但是,对于每个服务器实例,只能存在一个这样的设置。

使用专有的用户代理时

如果需要在请求 URI 中使用多字节字符,请将该字符串转换为 UTF-8 字节字符串,然后进行 URL 编码,再将其发送到 WebLogicServer。

W3C 建议在创建 URI 时基于 UTF-8 进行 URL 编码。(http://www.w3.org/TR/charmod/#sec-URIs)

按照 JSP J2EE 规范进行的更改(WebLogic Server 7.0 或更高版本)

在 JSP 1.2 规范中,如果存在多个 Page 指令,则产生“致命转换错误”。(CR066562)


摘自 JSP1.2 ---- JSP.2.10.1

JSP.2.10.1 page 指令


page 指令定义一些与页面相关的属性,并将这些属性传送到 JSP 容器。


转换单元(JSP 源文件及通过 include 指令包含的任何文件)可以包含 page 指令的多个实例,所有特性都将应用于整个转换单元(即 page 指令与位置无关)。但是,除 Import 特性之外,在给定的转换单元中,此指令定义的任何特性/值只应出现一次;Import 特性的使用次数将进行累计(使用有序集联合语义)。除此之外的其他多个特性/值定义(或重定义)将导致致命转换错误。


这就是说,如果一个编译单元出现多个 page 指令,将会产生致命转换错误。在 WebLogicServer Server 7.0 中,已对 JSP 操作进行了更改,使其符合此规范。

在将一个单独的 JSP 文件包括在静态包含文件 (<%@ include file=. . . %>) 中时,如果包含源与包含目标都有相应的 page 指令,这种更改会出现问题。在静态包含文件中,JSP 容器将计算所有的 jsp,从而会导致它们包括在一个编译单元中,而且这种情况下会生成多个 page 指令,并出现“致命转换错误”。

为避免这种问题,WebLogic Server 7.0 中准备了下列选项作为 weblogic.xml 的新参数。

代码列表 1-2:weblogic.xml 中新添加的参数

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

通过此参数,只要编码相同,即使一个编译单元中出现多个 page 指令,也不会出现错误。

J2EE 默认编码规范(WebLogic Server 7.0 或更高版本)

在 weblogic-application.xml 中,可以为整个 J2EE 企业应用程序的请求和响应指定默认字符编码。(CR065921)

在 weblogic-application.xml 中,可以通过以下参数来设置用于请求和响应的默认编码。
  • webapp.encoding.usevmdefault = true | false
  • webapp.encoding.default = java 编码名称

注意:在 webapp.encoding.default 中指定的值是 Java 编码名称,而不是 IANA 字符集名称。

如果同时设置了上述两个选项,将使用 webapp.encoding.usevmdefault。

可以分别设置这些响应和请求值。此外,这些选项仅会应用于响应和请求,它们不会应用于 JSP 编译过程中的编码读取操作。有关分别设置响应和请求值的方法以及 JSP 文件编码的详细信息,请参阅 programming

代码列表 1-3:weblogic-application.xml 中的 webapp.encoding.usevmdefault 用法示例

<application-param>
  <description>webapp.usevmdefault</description>
  <param-name>webapp.encoding.usevmdefault</param-name>
  <param-value>true</param-value>
</application-param>

或者

代码列表 1-4:weblogic_application.xml 中的 webapp.encoding.default 用法示例

<application-param>
  <description>default encoding</description>
  <param-name>webapp.encoding.default</param-name>
  <param-value>SJIS</param-value>
</application-param>

WTC TUXEDO 域的编码规范 (CR052022)(WebLogic Server 7.0 或更高版本)

可以为 TUXEDO 域指定 wtc 域编码。在启动时指定以下参数。更改服务器的启动脚本(StartWebLogic.cmd 文件等)。
-Dweblogic.wtc.encoding=Java encoding name

此编码规范对于整个 TUXEDO 域有效。

XML -- StreamParser 中的多字节字符处理(WebLogic Server 7.0 或更高版本)

为了将编码信息添加到使用 XML 流 API 生成的 XML 头中,请按如下方式使用 ElementFactory 类的“createStartDocument()”。
XMLOutputStreamFactory factory = XMLOutputStreamFactory.newInstance();
XMLOutputStream output = factory.newOutputStream(new
			OutputStreamWriter(new FileOutputStream(fname),"Shift_JIS")); 
output.add(ElementFactory.createStartDocument("Shift_JIS","1.0"));
output.flush();

与 xerces 解析器相似,使用 XML 流 API 解析包含日语的 XML 文档时,请注意以下几点。
  • 在解析器输入中使用流时请使用字节流。
  • 通过使用字节流,可以使用解析器的 XML 编码自动身份验证功能。解析器在内部生成适合 XML 头编码规范的流,从而确保了解析的正确性。

  • 在作为 Unicode 字符流传递时,解析器将忽略 XML 头中的编码规范。
  • 这种情况下,用户负责传递正确的字符流。


部署描述符文件中的编码处理

在 WebLogic Builder 或管理控制台中编辑和保存部署描述符文件时,会保存初始部署描述符的编码。如果在部署描述符文件的 XML 声明中没有指定编码特性,该文件将按 UTF-8 处理。

 


已知问题

WebLogic Server 的已确认问题
  • 当管理用户名是多字节时,受管服务器不能启动。(CR187310)
  • 当受管服务器的服务器名使用多字节字符时,无法启动。(CR135902)
  • 多字节资源名可能会导致 WebLogic Server 消息中出现无效字符。(CR176460)

管理控制台的已确认问题
  • 在通过管理控制台上载的应用程序模块文件的文件名中,不能使用多字节字符。(CR135901)
  • 在管理控制台中创建连接缓冲池时,如果数据库用户包含多字节字符,将无法正确创建连接缓冲池。(CR135890)
  • 解决办法:直接编辑域的 config.xml。

  • 如果管理服务器和受管服务器的区域不同,管理控制台无法正确显示受管服务器的日志。(CR135899)
  • 如果使用多字节字符,有时无法从管理控制台更改用户的密码。
  • 发送多字节字符时,管理控制台中 JMS 目标接收的字节数不正确。(CR124364)
  • WebLogic 的默认身份验证提供程序的导出功能按平台默认编码方式输出文件。因此,当用户和组数据中包含多字节字符时,将无法在具有不同区域的服务器之间正确传输数据。(CR135233)
  • 管理控制台服务器日志屏幕中显示的某些消息的最后一个字符可能存在编码问题。(CR202036)

Configuration Wizard 的已确认问题
  • 如果要创建的服务器名称使用多字节字符,该服务器启动脚本中的 SERVER_NAME 值就是乱码,或者该脚本使用固定编码方式生成。如果按原样创建该名称,服务器可能无法启动。(CR184615)

    解决办法:必须正确修改启动脚本中的 SERVER_NAME 值,并与系统区域相符,然后重新保存该启动脚本。


安装的已确认问题
  • 如果 BEA_HOME、WL_HOME 或已创建域的目录路径中包含多字节字符,则 WebLogic Server、Configuration Wizard 等无法启动或卸载。安装时,不要在 BEA_HOME、WL_HOME 或已创建域的目录路径中包含多字节字符。(CR182236、CR207614、CR207615)

JDBC 的已确认问题
  • 如果使用包含 XA JDBC 驱动程序的多字节名连接缓冲池,则会出现异常。(CR176457)
  • 当 Oracle 数据库的版本是 8.1.7 并且使用的服务器端字符集与客户端字符集 (NLS_LANG) 不相同时,如果在 CHAR-type 和 DATA-type 列中使用 prepared statement 并对这些列进行更新,则会丢失数据。

  • 解决办法:
    使 Oracle 服务器端字符集和客户端字符集保持一致,或者将 Oracle 数据库服务器的版本更改为 9.2.0。


WebLogic 工具的已确认问题
  • 如果 Mbean 类型是使用 WebLogic MbeanMaker 创建的,则 MDF 文件名和目录路径中不能包含多字节字符。(CR187425)
  • 使用 WebLogic Builder 的实体 EJB 进行编辑时,如果在树中选择了 [containerManaged]-[Finder],则即使在右侧窗格中单击 [添加] 按钮并在所显示的对话框单击 [取消],该对话框也无法关闭。

    解决办法:单击对话框右上角的 [x] 按钮。

    在所显示对话框的 [EJB QL] 中输入一个值后,单击 [取消] 按钮。
  • 如果在 Weblogic.Deployer 命令中指定了 -upload 选项,则无法部署名称中包含多字节字符的应用程序模块。(CR124704)
  • 解决办法:用英语命名应用程序模块。

  • 部署 EJB 时,日语消息在 Weblogic Builder 消息窗格中有时变成无效字符。(CR136165)

  • 在部署指定了容器字段定义的 CMP 时,会发生这种问题。
  • 在 Weblogic Builder 中保存应用程序模块时,不能用 [文件] > [另存为] 命令指定现有的文件名。(CR136170)

  • 现有文件不能正确进行更新。

    解决办法:指定新的文件名。


Web Service 的已确认问题
  • UDDI API 或 UDDI 浏览器不能正确处理多字节字符。(CR103834)

 


已解决问题

WebLogic Server 的已解决问题
  • 对于在 AIX 上使用 IBM JDK 运行的 WebLogic Server 来说,使用 ISO-2022-JP(JIS) 的 JSP 有时不能正确地输出日语。此问题已在这一版本得以解决。(CR131694)

管理控制台的已解决问题
  • 安全策略设置弹出窗口出现问题,当简体中文版的 WebLogic Server 管理控制台语言设置为简体中文时,该窗口工作不正常,但此问题已在这一版本得以解决。(CR186756)

Web Service 的已解决问题
  • 如果 EAR 文件中的 Web Service 的实现类的名称包含多字节字符,Clientgen 将无法正确生成客户端 JAR。此问题已在这一版本得以解决。(CR188548)
  • 如果将多字节字符进行加密并从客户端应用程序发送,则不能为 weblogic.webservice.i18n.charset 指定 UTF-8 之外的其他编码。此问题已在这一版本得以解决。(CR131690)

JRockit 的已解决问题
  • JRockit 的异常消息(如 FileNotFoundException)在日语区域中有时会变成无效字符。此问题已在这一版本得以解决。(CR176741)
  上一页 下一页