WebLogic Server 中的 I18n (國際化) 問題

WebLogic Server 中的 I18n (國際化) 問題

下列章節說明在繁體中文環境中使用 WebLogic Serve 的一般注意事項。

 


國際化概觀

WebLogic Server 中 I18n 的主要特性:

  • 在 WebLogic Server 中,所有字元都會被視為 Unicode 來處理。在輸入或輸出字元資料時,都會執行字碼轉換。
  • 必須分別為 WebLogic Server、J2EE 元件,以及 WebLogic Server container 上的資源指定相對應的編碼轉換。
  • 如果沒有指定編碼轉換,系統會使用預設的編碼轉換。
  • 系統提供多種類型的預設編碼轉換,但其中一些編碼轉換與作業系統的語言區域不一致。

在建置以 WebLogic Server 處理多位元字元資料的分散式系統之前,必須先瞭解如何分別為 Java 和 J2EE 指定相對應的編碼。此外,必須依據與 WebLogic Server 連接之系統 (例如:作業系統、網際網路、後端系統) 的編碼處理方式來控制編碼轉換。

下列是 WebLogic Server 中編碼處理的概要說明。

Unicode 的使用

使用 Unicode 進行內部編碼的 WebLogic Server,是一個純 Java 應用程式伺服器程式。

因此,只要是 Unicode 可以處理的字元,WebLogic Server 就可以同時處理所有語言的字元。

編碼轉換

當 WebLogic Server 與外部系統交換字元資料時,需要進行編碼轉換。

在一般的作業系統中,幾乎沒有使用 Unicode (即 Java 的內部編碼) 的環境。作業系統會使用針對每種平台個別定義的 '本地編碼'。例如,Windows 系統的原生編碼是與語言相關的字碼頁,Unix 系統的原生編碼是與語言地區 (由 LANG 環境變數指定) 相對應的編碼,而資料庫的原生編碼則是在建立資料庫時所指定的字元集或由客戶端指定的字元集。

因此,在 WebLogic Server 中輸入和輸出資料時,必須進行原生編碼與 Unicode 之間的編碼轉換。當 WebLogic Server 與作業系統或外部資源交換字元資料時,都會執行這樣的編碼轉換。

注意:序列化的 Java 類別資料流中所包含的字元,會以 Unicode (UTF-8 編碼) 存放在類別的內部資訊中。這表示使用者無需考慮序列化資料流的字碼轉換問題。例如,您不必考慮 EJB 或 RMI 的編碼。

編碼轉換流程會耗用大量的 CPU 資源,因為它是針對每個字元逐一進行轉換的。為了確保較佳的系統效能,在設計應用程式時應盡量避免執行字碼轉換。

WebLogic Server 伺服器本身的編碼轉換,與伺服器上之應用程式元件及資源的編碼轉換是各自獨立的

在 WebLogic Server 中,伺服器本身的編碼轉換與 WebLogic Server 上應用程式元件及資源的編碼轉換是分開的。

在 WebLogic Server 中,伺服器記錄檔或管理主控台的編碼,是由伺服器的 Java VM 或瀏覽器語言設定的預設編碼決定的;與應用程式元件的編碼或 WebLogic Server 提供之內容所用的語言無關。

而且,在設定 WebLogic Server 的行為時,可以不考慮 WebLogic Server 所使用的語言地區或語言設定。

此外,還可以為 WebLogic Server container 中所設定的資源,分別設定編碼轉換。

WebLogic Server 本身的編碼轉換包括︰

  • WebLogic Server 的系統記錄檔輸出
  • 管理主控台的頁面編碼
  • WebLogic Server 和本地檔案系統之間的檔案輸入/輸出

個別的應用程式的編碼轉換包括︰

  • JSP 檔案
  • Servlet
  • DD (部署描述元) 檔案
  • XML
  • Web services

WebLogic Server 上的資源包括:

  • JDBC 連結
  • WTC 連結等

在 WebLogic Server 中指定編碼時,必須清楚要為哪些類別指定編碼。然後,必須檢查是否可以建立有效的字元物件,並且是否可以將 WebLogic Server 中的字元物件正確地轉換為所需的編碼。

如上所述,為了正確地進行設定,使用者有必要瞭解編碼轉換的行為。如果不指定編碼轉換,應用程式將無法正確地處理多位元字元。

如果不指定編碼,WebLogic 會使用適合於當前情況的預設編碼。依據目標規格或環境的不同,可能使用不同的預設編碼。

預設編碼範例

影響 WebLogic Server 行為的預設編碼包括︰

  • 伺服器 VM 的預設編碼
  • J2EE 的預設編碼
  • XML 的預設編碼
  • HTTP 協議的預設編碼
  • 瀏覽器的預設編碼
  • Web services (例如 SOAP、WSDL、UDDI) 的預設編碼等

典型預設編碼的範例

  • 在繁體中文版的 Windows 中,伺服器 VM 的預設編碼通常是 MS950。
  • J2EE 的預設編碼通常是 ISO-8859-1。
  • XML 的預設編碼通常是 UTF-8。
  • HTTP 的預設編碼通常是 US-ASCII。

如上所述,由於不同的預設編碼適用於不同的目標。因此,如果不指定相對應的編碼,WebLogic Server 將無法正確地處理繁體中文。為了可以控制編碼轉換,使用者應該瞭解下列各節內容。

在 Java 語言術語中,編碼即表示 "字元集"。用於說明字元集的字詞很多,但每個字詞的定義略有不同。

編碼或字元集是一種定義,此定義會將電腦可讀字碼分配給特定語言的字元集合,以便電腦可以處理這些字元。該定義在 Java 術語中稱為 "編碼",在網際網路術語中稱為 "字元集"。

Java 語言在其輸入/輸出區段中化解了這些差異,因此可以將所有字元視為 Unicode 在內部進行處理。這意謂著,只要字元集的編碼定義存在,Java 便可以處理任何字元集,並且化解存在於各個系統之間的所有編碼差異。然而,目前尚沒有能夠處理現有編碼之間所有細微差異的編碼轉換表。此外,由於 Unicode 的一致性問題,現有編碼表中仍有一些限制。

在 Java Web 應用程式伺服器中,Java 編碼名稱與 MIME 字元集之間的差異尤為重要。MIME 字元集是由 IANA 定義的,用於網際網路和 XML 檔案中。WebLogic Server 使用對應表來關聯 Java 編碼名稱與 IANA 字元集名稱,以化解這種差異。透過此對應表,WebLogic Server 可以處理在 JSP 中定義為 'Shift_JIS',或以 Java 編碼名稱定義為 'MS932' 的檔案。使用者可以修改 WebLogic Server 的對應表,以將 'Shift_JIS' 字元集作為 'cp943' Java 編碼來處理。

Xerces 是 WebLogic Server 的內建 XML 解析器,有其自己的 IANA-Java 對應表。使用者無法自行定義該對應。例如,'Shift_JIS' 的 IANA 字元集名稱會對應為 Java 編碼名稱 'SJIS'。

基本上,在 WebLogic Server 中會使用 Java 編碼名稱來指定編碼。而在 J2EE、網際網路或 XML 中,則使用 IANA 字元集名稱。如有必要,使用者可以修改此對應。

 


安裝

WebLogic Server 提供繁體中文版安裝程式與英文版安裝程式。兩個版本的安裝程式可以從 BEA Systems, Inc. 網站上下載。

在 WebLogic Server 8.1 繁體中文版中,不提供下列功能:

  • 智慧更新
  • 網路安裝程式

 


WebLogic Server 系統管理

下列項目會使用 WebLogic Server 的 JVM 預設編碼︰

  • WebLogic Server 的錯誤記錄檔輸出
  • 與本地檔案系統之間的檔案輸入和輸出

下列項目會使用瀏覽器的預設語言︰

  • 管理主控台 (註:此部分目前尚未進行繁體中文化)

若要將記錄檔等輸出的編碼,變更為使用伺服器的預設編碼,請執行下列步驟︰

WebLogic Server 和 Java Virtual Machine 中的編碼

在 WebLogic Server 中,可以設定具有不同範疇的編碼。例如,可以設定 ContentType/字元集以指定 WebLogic Server 輸出到客戶端的編碼。此外,在使用 WebLogic jDriver 時,也可以使用 weblogic.codeset 屬性來指定 JDBC 連結的編碼。本文針對上述功能及更多其他功能進行討論。請注意,為特定範疇指定的編碼與執行 WebLogic Server 之 Java VM 的預設編碼之間沒有任何關係。如果 Java VM 執行於英文語言地區,則使用繁體中文 JSP 檔案提供服務不會有任何問題。但是,處理下列字串時會使用 Java VM 預設編碼︰

  • WebLogic Server 的錯誤記錄檔輸出
  • 與本地檔案系統之間的檔案輸入和輸出

這些字串會使用每個平台的 Java VM 預設編碼 (由 file.encoding 這個 Java 系統屬性所指定的編碼)。例如,WebLogic Server 輸出到終端主控台之記錄檔訊息的語言和編碼,取決於 Java VM 中所指定的編碼。file.encoding 這個 Java 系統屬性取決於平台環境和作業系統的語言地區。因此,如果想要變更 WebLogic Server 記錄檔訊息的語言和編碼,必須變更系統的語言地區。當 VM 啟動之後,就無法動態變更 Java VM 預設編碼。重新啟動 WebLogic Server 之前,請確認已執行下列設定。

Windows 2000/Windows NT

在 [控制台] 的 [地區選項] 中,選擇了 [英語 (美國)] 或 [繁體中文]。如此,伺服器便會使用 CP1252 或 MS950 作為預設編碼。

UNIX

在 LANG 環境變數中指定平台可支援的語言地區。

下列是伺服器編碼和 LANG 環境變數的設定︰

表2-1 伺服器編碼和 LANG 環境變數的設定

平台

編碼

LANG 環境變數

Solaris

Big5

zh_TW.BIG5

HP

Big5

zh_TW.big5

例如,如果在 Solaris 上指定 Big5 (請先確認相關的 OS 語言地區套件已確實安裝),則 LANG 設定如下所示︰

LANG=zh_TW.BIG5

檢查伺服器編碼的方法

Java VM 預設編碼會成為 WebLogic Server 的預設編碼。透過參閱管理主控台中的記錄檔訊息,可以檢查編碼。執行步驟如下︰

  1. 在管理主控台中,用滑鼠右鍵單擊左側窗格中的伺服器名稱,然後選擇 [View Server log]。
  2. 單擊 [Customize This View]。
  3. 在 [Sub String] 文字欄位中,輸入 "file.encoding"。
  4. 單擊 [Apply] 按鈕。

    此時顯示的編碼即為伺服器目前的編碼。

關於設定管理和被管伺服器的說明

對 domain 中所有 WebLogic Server 使用相同的編碼。

在 WebLogic Server 中,domain 中的所有伺服器必須具有相同的編碼設定。

例如,當 domain 執行在 Windows 平台時,可以統一使用 Big5 編碼類型 (例如 MS950)。如果某部伺服器使用不同的編碼,則伺服器記錄檔將無法正確顯示。

關於設定叢集的說明

對叢集中所有 WebLogic Server 使用相同的編碼。

在 WebLogic Server 中,叢集中的所有伺服器必須具有相同的編碼設定。

例如,當叢集執行在 Windows 平台時,可以統一使用 Big5 編碼類型 (例如 MS950)。如果某部伺服器使用不同的編碼,則伺服器記錄檔將無法正確顯示。

config.xml 的編碼

config.xml 檔案會以 UTF-8 格式輸入/輸出。使用文字編輯器直接編輯該檔案時,請以 utf-8 格式進行讀取和儲存。

關於使用 WebLogic Server 作為 Web 伺服器的說明

下列是使用 WebLogic Server 作為 Web 伺服器的說明︰

若要將 contentType 字元集參數添加到 HTTP 標頭中以提供 HTML 檔案,請在 web.xml 檔案中插入下列定義,這些定義可以明確地指定 HTML 檔案的編碼︰

<mime-mapping>
  <extension>html</extension>
  <mime-type>text/html;charset=Big5</mime-type>
</mime-mapping>

如此即可省去倚賴如下的 META 標記,從 HTML 檔案中作字元集設定︰

<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=Big5">

JDBC 連結

建立 JDBC Connection Pool 時,必須為使用多位元字元的 DB 連結指定相對應的編碼。使用者可能需要匹配 Web 層與 DB 層之間的編碼轉換對應。

如需詳細資訊,請參閱《WebLogic jDriver for Oracle (Deprecated)》中〈WebLogic jDriver Advanced Features〉一章中的 "Codeset Support"。

部署

在 WebLogic Server 中,會依照 XML 宣告中所指定的方法,對 J2EE 元件的 DD (部署描述元) 檔案中的多位元字元編碼進行處理。如果 DD 檔案在 XML 宣告中沒有編碼屬性,或根本沒有 XML 宣告,則該檔案會視為 UTF-8 來處理。

在 WebLogic Builder 或管理主控台中,當編輯 DD 檔案並儲存所做的變更時,該檔案的編碼與原始檔案中的編碼相同。

在 WebLogic Builder 或管理主控台中建立的 DD 檔案不具有 XML 宣告。變更這類檔案的編碼時,請在 XML 宣告中設定編碼屬性,並對檔案進行相對應的編碼轉換。

 


程式設計

關於使用 Servlet 和 JSP 的說明

編碼轉換、標準、範疇及偏好設定

WebLogic Server 是 Java 應用程式。所有字串都會視為 Unicode 字串來進行內部處理。另一方面,有許多字元集可供 HTML 頁面使用。在 WebLogic Server 中處理 HTML 資料時,Unicode 與 HTML 字元集之間的編碼轉換是透過 Java 編碼轉換器執行的。因此,在使用 WebLogic Server 時,如何在應用程式中執行伺服器內部處理的 Unicode 字串與 HTML 編碼之間的轉換是非常重要的。

WebLogic Server 針對數個不同的範疇,提供編碼設定的參數,利用這些參數,可協助解決應用程式在處理編碼上的疑難雜症

此外,在 WebLogic Server 中,可以分別設定每個模組的編碼,而與 JavaVM 預設編碼無關。

在 WebLogic Server 中,有些設定編碼的方式是由 J2EE 規格定義的。其他方法是則 WebLogic 的專有規格,使用者無需全部指定。請閱讀下列說明,然後針對您的環境選擇最適當的編碼設定組合。

編碼設定

與 JSP/Servlet 有關的編碼設定包括︰

  • 從 Servlet 輸出之 HTTP 回應中使用的 Writer 類別編碼
  • JSP 檔案的編碼
  • 從 JSP 輸出的 Writer 類別編碼
  • HTTP 請求 (例如 GET/POST) 的編碼 (針對特定請求 URL)
  • 資料 (例如 GET/POST) 的編碼 (針對特定 HTTP 請求)
  • JSP container 的編碼
  • Java 編碼與 IANA 字元集之間的對應

一般而言,範疇愈小,其優先順序愈高。例如,如果把 UTF-8 設定為 JSP container 的預設編碼,而且在特定 JSP 的 page 標記中指定了 Big5,則 page 標記中指定的編碼會取得較高的優先順序 (即使用 Big5)。

建議在應用程式中使用相同的指定編碼,或者應該針對 JSP container 層級這種較廣的範疇,一次設定主要使用的編碼。然後,針對要求特殊編碼處理的地方,在更具體的層級 (例如 JSP 或 Servlet 本身) 上設定編碼。

使用繁體中文語言的一般說明

請注意,如果下列項目未針對 HTTP 請求和 HTTP 回應指定任何編碼,則會使用 ISO-8859-1 編碼。

Servlet

  1. 指定 HTTP 回應的編碼 --- response.setContentType()
  2. 指定瀏覽器顯示的編碼 --- Content-Type
  3. 指定 HTTP 請求的編碼 --- request.setCharacterEncoding 或 <input-charset>

JSP

  1. 指定 JSP 檔案的編碼 --- page 標記中的 pageEncoding 指令 (可選)
  2. 指定頁面輸出的編碼 --- page 標記中的 contentType 指令
  3. 指定瀏覽器顯示的編碼 --- Content-Type
  4. 指定 HTTP 請求的編碼 --- request.setCharacterEncoding 或 <input-charset>

Servlet 和 JSP

  1. Java 編碼與 IANA 字元集之間的對應 (設定於 weblogic.xml)

下列內容詳述 Servlet 和 JSP 的每個設定。

Servlet

指定 HTTP 回應的編碼 --- response.setContentType()

若要指定由 Servlet 產生之 HTML 頁面的編碼,請使用 setContentType() 方法。對 setContentType() 的呼叫會指定下列項目︰

  • 用於回應之 HTTP 標頭中的 ContentType 屬性
  • 用於回應輸出的 Writer 編碼

因此,在取得 Writer 之前,必須先呼叫 setContentType()。

res.setContentType("text/html;charset=Big5");
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("Big5");
    		String pval = request.getParameter(pname);
  • 使用 <input-charset> 在 Web 應用程式的部署描述元 (weblogic.xml) 中指定請求 URL 的編碼。

    在 WebLogic Server 6.1 或以上版本中,此編碼設定於 weblogic.xml。但在 WebLogic Server 6.0 中,則是設定於 web.xml。而且元素名稱等也已變更。因此,從 WebLogic Server 6.0 進行遷移時,需要修改 weblogic.xml 和 web.xml 檔案。請參閱遷移指南。

例如,若要指定 <input-charset>,使用者可以對其進行設定,以便按下列方法獲取請求 URL 的編碼︰

範例

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

如下所示,在部署描述元 (weblogic.xml) 中針對目標 Web 應用程式設定適當的 <input-charset>。

在 <charset-param> (內嵌於 <weblogic-web-app>) 中,寫入要指定編碼的請求 URL 路徑,並且以 IANA 名稱來指定 HTTP 請求的編碼。

如需關於在 Java 編碼名稱與 IANA 字元集之間進行對應的資訊,請參閱 "在 Java 編碼與 IANA 字元集之間進行對應 (weblogic.xml 中的設定)" 一節。

下列是單一 Web 應用程式處理多個編碼的範例。

在下列範例中,"/*" 的編碼是 Big5,"/rus/jo/*" 的編碼是 ISO-8859-1。

<charset-params>
  <input-charset>
    <resource-path>/*</resource-path>
    <java-charset-name> Big5</java-charset-name>
  </input-charset>
</charset-params>
<charset-params>
  <input-charset>
    <resource-path>/rus/joe/*</resource-path>
    <java-charset-name>ISO-8859-1</java-charset-name>
  </input-charset>
</charset-params>

如需關於此設定的詳細資訊,請參閱《Developing Web Applications for WebLogic Server》中的 "charset-params" 一節。

JSP

指定 JSP 檔案的編碼 - pageEncoding (可選)

若要指定 WebLogic Server JSP container 或 JSP 編譯器用來讀取 JSP 檔案的編碼,請在 page 標記中指定 pageEncoding 指令,如下所示︰

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

指定頁面輸出的編碼 --- page 標記中的 contentType 指令

若要指定頁面輸出的編碼,請在 page 標記中指定 contentType 指令,如下所示︰

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

此外,在 page 指令中指定 contentType 時,會在 HTTP 回應的 HTTP 標頭中指定相同的 contentType。這表示將同時指定瀏覽器顯示的編碼。

如果未設定 pageEncoding 指令,則會使用 contentType 指令作為讀取 JSP 檔案的編碼。

如果 JSP container 找到了 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("Big5");
             String pval = request.getParameter(pname);
         %>request.setCharacterEncoding or <input-charset>

Servlet 和 JSP

Java 編碼與 IANA 字元集之間的對應 (設定於 weblogic.xml)

使用 setContentType() 方法或 page 標記中的 contentType 指令來指定編碼時,請使用 IANA 字元集名稱。然而,在 WebLogic Server (Java 應用程式) 中處理編碼時,這些值必須是 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 的別名)。

使用者可以透過在 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 進行遷移時,請注意這些變更。

當 HTTP 請求編碼已被限定成 ISO-8859 時的解決方法

儘管當 HTTP 請求的編碼已在 <input-charset> 中被設為 iso-8859,您仍舊可以透過下列方法取得具有不同編碼的 HTTP 請求。

範例:

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

但是,對於經由下列方式在 HTTP 請求的 HTTP 標頭中指定 contentType 的 HTTP client,則不能使用此解決方法,因為在 HTTP 標頭的 contentType 中指定的編碼,其優先順序高於在 <input-charset> 中所指定的編碼。在這種情況下,必須修改應用程式碼。

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

靜態與動態包含在編碼處理上的差異

靜態包含

<%@ include file="relativeURL" %>

在這種情況下,在執行 JSP 編譯之前,會載入所有包含檔案並收集到一個檔案中。因此,如果在進行包含的檔案中指定了編碼,則即便被包含的檔案未指定編碼,亦會被視為與包含檔案使用相同的編碼來進行處理。在 WebLogic Server 6.1 或以上版本中,如果 'include origin' 與 'include destination' 指定相同的編碼,則不會發生編譯錯誤。在 WebLogic Server 8.1 中,如果 'include origin' 與 'include destination' 具有各自的 page 指令,將會發生編譯錯誤。為了避免此問題,請將 weblogic.xml 中的 'backwardCompatible' 設定為 True。

即使將 backwardCompatible 設定為 True,如果 'include origin' 與 'include destination' 的編碼設定不同,也會發生 JSP 編譯錯誤。

動態包含

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

在動態包含中,載入頁面時不會包含該頁面,而是將其保留在標記狀態。當 JSP 執行時才會包含該頁面。因此,負責包含動作之 JSP 中所設定的編碼,不會被套用於被包含的檔案。

因此,使用者須另行在被包含的檔案中指定編碼。

CGIServlet

將使用多位元字元的 CGI 服務遷移至 WebLogic Server 上的 CGI Servlet 時,必須在 CGI 程式產生的 HTTP 標頭中,指定相對應的 contentType 字元集參數。如果未設定 contentType,系統會使用 ISO-8859-1,即 J2EE Servlet container 的預設編碼。

此外,為了正確地從客戶端接收輸入字串,還必須使用相對應的編碼。使用者需要將該編碼設定到目標 Web 應用程式的 DD (部署描述元) 檔案中。如果未設定該編碼,將會使用 ISO-8859-1。

WebService

SOAP 訊息及其編碼的處理

接收 SOAP 訊息

在 WebLogic Server Web services 中,編碼處理符合 SOAP1.1 和 SOAP1.2 規格 (*註 1)。以 SOAP1.1 規格為基礎的 HTTP/SOAP 訊息具有 text/xml 媒體 (MIME) 類型,這些訊息的編碼是依據 RFC2376 來處理的。以 SOAP 1.2 規格為基礎的 HTTP/SOAP 訊息具有 application/soap+xml 媒體類型,這些訊息的編碼是依據 RFC3023 來處理的。以下說明基於 RFC 規格的行為︰

SOAP 1.1:

  • HTTP 標頭中的 ContentType 字元集參數,是用於決定 HTTP/SOAP 請求的編碼。
  • XML 宣告中的編碼屬性會被忽略。
  • 如果未使用 contentType 指定字元集,則會按照 RFC2376 將訊息視為 US-ASCII 來處理。

SOAP 1.2:

  • HTTP 標頭中的 ContentType 字元集參數,是用於決定 HTTP/SOAP 請求的編碼。
  • XML 宣告中的編碼屬性會被忽略。
  • 如果未使用 contentType 指定字元集,則會使用 XML 宣告中的編碼屬性。
  • 如果 contentType 字元集參數和 XML 宣告中的編碼屬性都未指定,則訊息將被視為 utf-8 來處理。

WebLogic Workshop 以及 WebLogic Sever 8.1 也會依據此規格來運作。因此,對用 WebLogic Workshop 開發、使用 HTTP/SOAP 的 Web services 客端程式,請注意要正確地指定 contentType 字元集。

傳送 SOAP 訊息

所有由 WebLogic Server 產生的 HTTP/SOAP 訊息會使用 utf-8 來編碼。在產生過程中,'encoding=UTF-8' 會被添加到 SOAP 訊息的 ContentType 標頭中。

注意: 在英文語言地區 (例如,在 UNIX 中指定 LANG=C) 中啟動 WebLogic Server 時,SOAP 訊息中便只能使用 us-ascii 字元,無法支援其他字元。如果 Web services 中欲使用繁體中文字元,請確定在繁體中文語言地區中啟動 WebLogic Server。

如果您希望在啟動於英文語言地區的 WebLogic Server 上使用 us-ascii 以外的其他字元,可以在 WebLogic Server 啟動指令檔中設定下列啟動選項。這會指示 WebLogic 產生 utf-8 格式的訊息,即便 WebLogic Server 運作於英文語言地區。

注意: 建議使用 UFT-8 來處理 SOAP 訊息。

-Iweblogic.webservice.i18n.charset=utf-8

Web services 首頁

Web services 首頁是使用伺服器 VM 預設編碼產生的。

UDDI 瀏覽器

UDDI 瀏覽器僅支援 us-ascii 字元,無法正確地使用多位元字元。

XML -- StreamParser 中的多位元字元處理

在 WebLogic Server 中,若要將編碼資訊添加到使用 XML Streaming API 產生的 XML 標頭中,請使用 ElementFactory 類別的 createStartDocument(),如下所示︰

XMLOutputStreamFactory factory = XMLOutputStreamFactory.newInstance();
XMLOutputStream output = factory.newOutputStream(new
                    OutputStreamWriter(new FileOutputStream(fname),"Big5")); 
output.add(ElementFactory.createStartDocument("Big5","1.0"));
output.flush();

下列是關於使用 XML Streaming API 解析包含繁體中文字元之 XML 文件的說明。要點與 Xerces 解析器本身附帶的使用說明相同。

當您透過 stream 來提供輸入給解析器時,請使用 byte stream。這會啟用解析器的 XML 編碼自動檢測功能,解析器可以使用由 XML 宣告中的編碼屬性所指定的編碼來產生 character stream,從而確保解析的正確性。

反之,透過 Unicode character stream 進行輸入時,解析器將會忽略 XML 標頭中的編碼設定。

JDBC

使用 BEA WebLogic Type4 Oracle 驅動程式

在 WebLogic Server8.1 中,裝有各種資料庫 (例如 Oracle、SQL Server、DB2 等) 的 BEA Weblogic Type4 驅動程式。下列內容說明如何使用 WebLogic Type4 Oracle 驅動程式來建立環境,以作為範例︰

設定環境

在 WebLogic Server 8.1 中,BEA WebLogic Type4 驅動程式安裝在 WL_HOME\server\lib 目錄中。這些檔案包含在 weblogic.jar 內 Manifest 檔的 CLASSPATH 屬性中,會自動被添加至伺服器的 CLASSPATH 中。
因此,透過 WebLogic Type 4 驅動程式,您可以直接從 WebLogic Server 上的 JDBC 客戶端 (JSP、Servlet 等) 連結至資料庫。如需關於針對 WeLogic 中所使用之 JDBC 客戶端進行程式設計的詳細資訊,請參閱 WebLogic Type 4 JDBC Drivers

Connection Pool 設定

從管理主控台設定 Connection Pool

設定使用 BEA WebLogic Type4 Oracle 驅動程式的 Connection Pool 時,請執行下列設定︰

如需詳細資訊,請參閱 WebLogic Type 4 JDBC Drivers

從管理主控台設定 Connection Pool

  1. 設定 domain。

  2. 使用管理主控台中的 "Service" > "JDBC" > "Connection Pool" 索引標籤,開啟 "Configure a new JDBC Connection Pool"。

  3. 在 "Choose database" 畫面中,將資料庫類型設定為 "Oracle",並將資料庫驅動程式設定為 "BEA's Oracle Driver (Type 4) Version8.1.7,9.0.1,9.2.0"。

  4. 在下一個畫面中,輸入 Connection Pool 的名稱和屬性。

  5. 在 "Test database connection" 畫面中測試驅動程式設定。

  6. 成功連結之後,請執行下一個畫面中的 "Create and deploy"。

在使用設定精靈建立 domain 期間設定 Connection Pool

  1. 啟動設定精靈。

  2. 選擇可選樣板,然後選擇 "Custom Configuration"。

  3. 在 "Database (JDBC) option" 畫面中選擇 "Yes"。

  4. 在 "Configure a JDBC Connection Pool" 畫面中執行下列設定︰

        	Vendor :Oracle
    Driver :BEA?Oracle Driver(Type 4) Version 8.1.7,9.0.1,9.2.0
    (請以匹配您的環境為原則,設定所有其他項目)
    

手動設定 Connection Pool

在建立 Connection Pool 所在 domain 的 config.xml 中添加下列內容︰ (請變更標有底線部分的值,使其與您的環境匹配)

       	         <JDBCConnectionPool DriverName=weblogic.jdbc.oracle.OracleDriver" 
   		Name="testpool"
		Password="tiger"
		Properties="user=scott;portNumber=1521;SID=testdb;serverName=testserver"
		Targets="myserver"
		TestTableName="SQL SELECT 1 FROM DUAL"
		URL="jdbc:bea:oracle://jpw2k17:1521"/>

使用 BEA WebLogic jDriver for Oracle

下列是 BEA WebLogic jDriver for Oracle 的環境設定的說明︰

設定環境

若要使用 BEA WebLogic jDriver for Oracle 驅動程式,必須具備 WebLogic OCI 驅動程式原生函式庫。在 32 位元 Windows 系統上,WebLogic OCI 驅動程式原生函式庫會安裝在 WL_HOME\server\bin\ 中。在 Unix 平台上,WebLogic OCI 驅動程式原生函式庫則會安裝在 WL_HOME/server/lib/{OS name}/ 中。
在 WebLogic Server 8.1 中,預設的函式庫支援的資料庫版本是9.2.0。若要在 Windows 環境中引用不同的函式庫版本,請在 PATH 中添加所需的函式庫路徑。若要在 UNIX 環境中引用不同的函式庫版本,請在 LD_LIBRARY_PATH (若是 HP-UX,則為 SHLIB_PATH) 中添加所需的函式庫路徑。

除了 WebLogic OCI 驅動程式原生函式庫設定之外,下列是使用 JDriver for Oracle 所必要的設定︰

  1. 設定 Oracle 函式庫的路徑。
    在 startWebLogic.cmd (若是 UNIX 環境,則為 startWebLogic.sh) 中添加下一個設定。在 Windows 環境中,將變數環境 PATH 設定為 Oracle 安裝目錄 bin。
    set PATH=%ORACLE_HOME%\bin;%PATH%
    
    在 Unix 環境中,將 D_LIBRARY_PATH 或 SHLIB_PATH 添加到 lib (或 lib32) 中。 
    
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
    
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib32:$LD_LIBRARY_PATH
    如需詳細資訊,請參閱 Setting Up the Environment for Using WebLogic jDriver for Oracle
  2. 指定 Oracle 變數環境 NLS_LANG。
    NLS_LANG 和 weblogic.codeset (jDriver for Oracle 的連結屬性) 必須恆使用相同的編碼。如需詳細資訊,請參閱《WebLogic jDriver Advanced Features》中的 "Codeset support" 一節。


    透過上述設定,可以使用 WebLogic jDriver for Oracle,直接從 WebLogic Server 上的 JDBC 客戶端 (JSP、Servlet 等) 連結至資料庫。如需關於使用 WebLogic jDriver for Oracle,對 JDBC 客戶端進行程式設計的詳細資訊,請參閱 Using WebLogic jDriver for Oracle

Connection Pool 設定

為了使用 WebLogic jDriver for Oracle 來設定 Connection Pool,請完成下列設定。如需詳細資訊,請參閱 《Configuring WebLogic jDriver for Oracle》中的 "Setting Up a Connection Pool"。

 

從管理主控台設定 Connection Pool

  1. 設定 domain。

  2. 使用管理主控台中的 "Service" > "JDBC" > "Connection Pool" 索引標籤,開啟 "Configure a new JDBC Connection Pool"。

  3. 在 "Choose database" 畫面中,將資料庫類型設定為 "Oracle",並將資料庫驅動程式設定為 "BEA's Oracle Driver (Type 2) Version8.1.7,9.0.1,9.2.0"。

  4. 在下一個畫面中,輸入 Connection Pool 的名稱和屬性。

  5. 在 "Test database connection" 畫面中測試驅動程式設定。

  6. 成功連結之後,請執行下一個畫面中的 "Create and deploy"。

在使用設定精靈建立 domain 期間設定 Connection Pool

  1. 啟動設定精靈。

  2. 選擇可選樣板,然後選擇 "Custom Configuration"。

  3. 在 "Database (JDBC) option" 畫面中選擇 "Yes"。

  4. 在 "Configure a JDBC Connection Pool" 畫面中執行下列設定︰

        Vendor : Oracle
         Driver : Oracle's Driver(Type 2) Version 8.1.7,9.0.1,9.2.0
               (請以匹配您的環境為原則,設定所有其他項目)

    手動設定 Connection Pool

    在建立 Connection Pool 所在 domain 的 config.xml 中添加下列內容︰ (請變更標有底線部分的值,使其與您的環境匹配)

       	         <JDBCConnectionPool DriverName=weblogic.jdbc.oci.Driver" 
    		Name="testpool"
    		Password="tiger"
    		Properties="user=scott;server=testdb.testserver"
    		Targets="myserver"
    		TestTableName="SQL SELECT 1 FROM DUAL"
    		URL="jdbc:weblogic:oracle"/>
    		

    使用 Oracle OCI 驅動程式

    下列是為了使用 Oracle OCI 驅動程式而設定環境的說明︰

    設定環境

    在使用 Oracle OCI 驅動程式的 domain 中,設定 startWebLogic.cmd (或 startWebLogic.sh) 如下︰
    %ORACLE_HOME% 是 Oracle 客戶端的安裝目錄。

    1. 在 CLASSPATH 中添加下列內容:

      %ORACLE_HOME%\jdbc\lib\classes12.zip

      %ORACLE_HOME%\jdbc\lib\nls_charset12.zip

    2. 在 PATH 中添加下列內容:

      %ORACLE_HOME%

    現在您可以開始使用 Oracle OCI 驅動程式,直接從 WebLogic Server 上的 JDBC 客戶端 (JSP、Servlet 等) 連結至資料庫。如需關於使用 Oracle OCI 驅動程式對 JDBC 客戶端進行程式設計的詳細資訊,請參閱 Oracle 手冊。

    Connection Pool 設定

    使用 Oracle OCI 驅動程式設定 Connection Pool 時,請執行下列設定︰

    從管理主控台設定 Connection Pool

    1. 設定 domain。

    2. 修改 startWebLogic.cmd (或 startWebLogic.sh) 檔案,使其與使用中之 Oracle OCI 驅動程式的版本匹配。

      *在 CLASSPATH 中添加下列內容:

      %ORACLE_HOME%\jdbc\lib\classes12.zip

      %ORACLE_HOME%\jdbc\lib\nls_charset12.zip

      *在 PATH 中添加下列內容:

      %ORACLE_HOME%

    3. 使用管理主控台中的 "Service" > "JDBC" > "Connection Pool" 索引標籤,開啟 "Configure a new JDBC Connection Pool"。
    4. 在 "Choose Database" 畫面中,選擇 "Oracle" 作為資料庫類型,然後選擇 "Oracle's Driver (OC) Version8.1.7,9.0.1,9.2.0" 作為資料庫驅動程式。

    5. 在下一個畫面中,輸入 Connection Pool 的名稱和屬性。
    6. 在 "Test database connection" 畫面中測試驅動程式設定。

      使用 Oracle Client 8 時,請依照上述方法變更 URL。

      <修改前> jdbc:oracle:oci:@[資料庫名稱].[資料庫伺服器名稱]

      <修改後> jdbc:oracle:oci8:@[資料庫名稱].[資料庫伺服器名稱]

    7. 成功連結之後,請執行下一個畫面中的 "Create and deploy"。

    在使用設定精靈建立 domain 期間設定 Connection Pool

    1. 啟動設定精靈。

    2. 選擇可選樣板,然後選擇 "Custom Configuration"。

    3. 在 "Database (JDBC) option" 畫面中選擇 "Yes"。
    4. 在 "Configure a JDBC Connection Pool" 畫面中執行下列設定︰

            Vendor : Oracle
             Driver : Oracle? Driver(OCI) Version 8.1.7,9.0.1,9.2.0
          (請以匹配您的環境為原則,設定所有其他項目)
      	
    5. 修改 startWebLogic.cmd (或 startWebLogic.sh) 檔案,使其與使用中之 Oracle OCI 驅動程式的版本匹配。

      *在 CLASSPATH 中添加下列內容:

      %ORACLE_HOME%\jdbc\lib\classes12.zip

      %ORACLE_HOME%\jdbc\lib\nls_charset12.zip

      *在 PATH 中添加下列內容:

      %ORACLE_HOME%

      • 使用 Oracle Client 8 時,請更新已建立 domain 的 config.xml 中的 Connection Pool 設定,如下所示︰

        <修改前> URL="jdbc:oracle:oci:@[資料庫名稱].[資料庫伺服器名稱]

        <修改後> URL="jdbc:oracle:oci8:@[資料庫名稱].[資料庫伺服器名稱]

      手動設定 Connection Pool

      1. 修改建立 Connection Pool 所在之 domain 的 startWebLogic.cmd (或 startWebLogic.sh) 檔案,使其與所使用之 Oracle OCI 驅動程式的版本匹配。

        *在 CLASSPATH 中添加下列內容:

        %ORACLE_HOME%\jdbc\lib\classes12.zip

        %ORACLE_HOME%\jdbc\lib\nls_charset12.zip

        *在 PATH 中添加下列內容:

        %ORACLE_HOME%

      2. 在建立 Connection Pool 所在 domain 的 config.xml 中添加下列內容︰

      (請變更標有底線部分的值,使其與您的環境匹配)

         	         <JDBCConnectionPool DriverName=oracle.jdbc.driver.OracleDriver" 
      		Name="testpool"
      		Password="tiger"
      		Properties="user=scott"
      		Targets="myserver"
      		TestTableName="SQL SELECT 1 FROM DUAL"
      		URL="jdbc:oracle:oci:@testdb.testserver"/>
      		

      使用 Oracle Client 8 時的狀態 URL,如下所示。

      URL="jdbc:oracle:oci8:@testdb.testserver"

        使用 Oracle Thin 驅動程式

        Oracle Thin 驅動程式版本 9.2.0 會與 WebLogic Server 8.1 一起安裝。下列說明如何設定 Orcale Thin 驅動程式。

        設定環境

        在 WebLogic Server 8.1 中,Oracle Thin 版本 9.2.0 安裝在 WL_HOME\server\lib 目錄中。此檔案包含在 weblogic.jar 的清單類別路徑中,並且自動添加至伺服器類別路徑中。因此,可以使用 Oracle Thin 驅動程式,直接從 WebLogic Server 中的 JDBC 客戶端 (JSP、Servlet 等) 連結至資料庫。
        如需關於使用其他版本之 Oracle Thin 驅動程式的詳細資訊,請參閱《Programming WebLogic JDBC》中的 "Using Third-Party Drivers with WebLogic Server "。
        如需關於使用 Oracle Thin 驅動程式對 JDBC 客戶端進行程式設計的資訊,請參閱 Oracle 手冊。

        nls_charset12.zip 支援的字元集

        Oracle Thin 驅動程式支援 CHAR 和 VARCHAR 類型中的 US7ASCII、WE8DEC、ISO-LATIN-1、UTF-8 字元集。如果使用其他的字元集,請將 nls_charset12.zip 添加到 CLASSPATH 中。nls_charset12.zip 將會安裝在 WL_HOME\ext\lib 中。
        將 WL_HOME\ext\jdbc\oracle\920\nls_charset12.zip 添加到所使用 domain 的 startWebLogic.cmd (或 startWebLogic.sh) 的 CLASSPATH 中。如需詳細資訊,請參閱 Using the Oracle Thin Driver

        Connection Pool 設定

        使用 Oracle Thin 驅動程式設定 Connection Pool 時,請執行下列操作。如需詳細資訊,請參閱《Programming WebLogic JDBC》中的 Configuring and Using WebLogic JDBC

        從管理主控台設定 Connection Pool

        a) 設定 domain。

        b) 使用管理主控台中的 "Service" > "JDBC" > "Connection Pool" 索引標籤,開啟 "Configure a new JDBC Connection Pool"。

        c) 在 "Choose Database" 畫面中,選擇 "Oracle" 作為資料庫類型,然後選擇 "Oracle's Driver (Thin) Version8.1.7,9.0.1,9.2.0" 作為資料庫驅動程式。

        d) 在下一個畫面中,設定 Connection Pool 的名稱和屬性。

        e) 在 "Test database connection" 畫面中測試驅動程式設定。

        f) 成功連結之後,請執行下一個畫面中的 "Create and Deploy"。

        在使用設定精靈建立 domain 期間設定 Connection Pool

        a) 啟動設定精靈。

        b) 選擇可選樣板,然後選擇 "Custom Configuration"。

        c) 在 "Database (JDBC) option" 畫面中選擇 "Yes"。

        d) 在 "Configure a JDBC Connection Pool" 畫面中執行下列設定︰

              Vendor : Oracle
               Driver : Oracle? Driver(Thin) Version 8.1.7,9.0.1,9.2.0
            (請以匹配您的環境為原則,設定所有其他項目)
        	

        手動設定 Connection Pool

        在建立 Connection Pool 所在 domain 的 config.xml 中添加下列內容︰

        (請變更標有底線部分的值,使其與您的環境匹配)



           	         <JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver" 
        		Name="testpool"
        		Password="tiger"
        		Properties="user=scott"
        		Targets="myserver"
        		TestTableName="SQL SELECT 1 FROM DUAL"
        		URL="jdbc:oracle:thin:@testserver:1521:testdb/">
        		

        同時連結至不同編碼之資料庫時的限制

        使用 OCI 驅動程式時,必須為 NLS_LANG 和 weblogic.codeset 指定相同的編碼。如果將這些參數設定為相同的值,將會在 Oracle 端執行編碼轉換,因為使用者會以具有特定 NLS_LANG 之客戶端連結至 Oracle。
        例如,如果 NLS_LANG 和 weblogic.codeset 的編碼都是 SJIS,將會在 Oracle 端上執行相對應的編碼轉換,即使 Oracle DB 的編碼是 EUC-JP。如果這兩個參數相同,則無論 DB 的編碼為何,連結都會成功。

        posted on 2005-01-18 13:18  笨笨  阅读(1480)  评论(0编辑  收藏  举报

        导航