![]() ![]() |
| dev2dev 首页 > WebLogic Platform 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 编码需要修补程序。有关如何获取修补程序的信息,请与客户支持联系。 已在 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 在 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>
在 Web Service SOAP 消息中附加 XML(javax.xml.transform.Source 对象)时,可以在 XML 头中指定可选编码。但是,当您收到消息并检索附加的 XML 数据时,头编码为 UTF-8。 使用日语版的安装程序时,请将用于启动安装程序的命令外壳的区域更改为 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 的程序文件。 “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 应用程序。 <!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 名称之间的映射时也是如此。 在 SOAP1.2 的 HTTP SOAP 消息中使用的媒体类型是“application/soap+xml”。其操作与已在 SOAP1.1 中使用过的“text/xml”媒体类型的操作基本相同,但是,如果未在 HTTP 头的 contentType 中指定字符集,其操作会有所不同。 默认字符集是 us-ascii。在 XML 头中指定的编码将被忽略。在 WebLogic Server 8.1 中,SOAP1.1 消息遵从 RFC2376,因此该编码可被处理。 在 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”参数,并针对该请求生成编码;第三种方法是在服务器启动时指定默认编码。 有关详细信息,请参阅 webservice 中的“国际化”项。 http://e-docs.bea.com/wls/docs81/webserv/i18n.html 通过 servlet 容器(Web 容器),现在可以在 URL 中使用多字节字符。根据所使用的用户代理(Web 浏览器等),可以根据需要对服务器进行设置。 http://myHostName:port/myContextPath/myRequest/?myRequestParameter myContextPath 和 myRequest 部分将按如下进行处理。 注意: myRequestParameter 部分位于 URL 后面,可以通过指定为 Servlet 的 setCharacterEncoding() 的编码或指定为 weblogic.xml 的 input-charset 的编码进行解码。对于 myHostName 部分,建议采用符合 IESG 标准的国际域名。 如果未进行任何设置,WebLogic Server 8.1 将按如下方式处理请求。 例如,如果用户代理(Web 浏览器)是 MS IE (Microsoft Internet Explorer),则默认情况下,在地址栏中输入的多字节字符将首先编码为 UTF-8,然后进行 URL 编码。在 WebLogic Server 8.1 中,默认情况下,可以正确生成以 UTF-8 编码方式发送的此 URL 的字符串。 注意: 在 IE 的“Internet 选项”-->“高级”中,包含一个名为“总是以 UTF-8 发送 URL(需要重启动)”的选项,而且此选项必须处于启用状态(选中)。 如果用户代理是 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) 这就是说,如果一个编译单元出现多个 page 指令,将会产生致命转换错误。在 WebLogicServer Server 7.0 中,已对 JSP 操作进行了更改,使其符合此规范。 在将一个单独的 JSP 文件包括在静态包含文件 (<%@ include file=. . . %>) 中时,如果包含源与包含目标都有相应的 page 指令,这种更改会出现问题。在静态包含文件中,JSP 容器将计算所有的 jsp,从而会导致它们包括在一个编译单元中,而且这种情况下会生成多个 page 指令,并出现“致命转换错误”。 为避免这种问题,WebLogic Server 7.0 中准备了下列选项作为 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.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 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 文档时,请注意以下几点。 在 WebLogic Builder 或管理控制台中编辑和保存部署描述符文件时,会保存初始部署描述符的编码。如果在部署描述符文件的 XML 声明中没有指定编码特性,该文件将按 UTF-8 处理。
在部署指定了容器字段定义的 CMP 时,会发生这种问题。 现有文件不能正确进行更新。
|
| BEA.com BEA中国dev2dev在线 网络支持 站点地图 产品文档 合作伙伴站点 | ||