WebSphere Application Server 5.0在Linux平臺上中文界面亂碼問題的解決

第一部分:問題描述html

當WebSphere Application Server(如下簡稱爲WAS)安裝到中文Linux平臺時,常常出現中文被顯示爲方塊的狀況,以下圖所示:java


圖 1 應用程序組裝工具亂碼現象
圖 1 應用程序組裝工具亂碼現象

圖 2 FirstStep程序亂碼現象
圖 2 FirstStep程序亂碼現象
 linux

本文以在United Linux1.0下配置WebSphere Application Server 5.0 Base版本爲例,描述了定位及解決中文顯示亂碼問題的過程。web

第二部分:問題定位api

Linux下Java程序界面中中文顯示的問題,常常存在於XWindow配置、Java程序內部錯誤和Java環境配置等幾個方面。爲了輔助進行錯誤定位,咱們能夠寫一個簡單的Swing程序,以下所示:app

//在JDK 1.3.1 下調試運行經過(Linux & Windows 平臺)
import javax.swing.*;          
import java.awt.*;
import java.awt.event.*;
public class HZSwingTest {
    //Define two strings that containing DBCS and English character.
    private static String DBCSValue = "This is a DBCS string[漢字]";
    private static String DBCSWindowTitle = "DBCS Title[漢字]";
    public Component createComponents() {
        final JLabel label = new JLabel(DBCSValue);
        JPanel pane = new JPanel();
        pane.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
        pane.setLayout(new GridLayout(0, 1));
        pane.add(label);
        return pane;
    }
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
               UIManager.getCrossPlatformLookAndFeelClassName()); } 
        catch (Exception e) { }
        //Create the top-level container and add contents to it.
        JFrame frame = new JFrame(DBCSWindowTitle);
        HZSwingTest app = new HZSwingTest();
        Component contents = app.createComponents();
        frame.getContentPane().add(contents, BorderLayout.CENTER);
        //Finish setting up the frame, and show it.
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
}
                

 

該程序簡單模擬了WAS出錯時的界面,建立一個標題爲中文字符串的窗口,其中還包含一個顯示中文字符串的標籤。在Windows 2000 中文版和United Linux 1.0平臺上,其運行結果以下所示:jvm


圖 3 United Linux 1.0運行結果
圖 3 United Linux 1.0運行結果

圖 4 Windows 2000中文版運行結果
圖 4 Windows 2000中文版運行結果
 ide

因爲Windows平臺下程序運行正常,說明該測試程序在漢字顯示代碼上的編寫沒有問題。而該測試程序在United Linux 1.0上的錯誤現象,跟圖一、2一致,所以錯誤可能在XWindow配置和Java環境配置上。工具

而在Java虛機實現時,Java程序窗口的生成是經過調用操做系統API來完成的,跟具體操做系統相關。所以,一樣的Java程序窗口在不一樣操做系統上,其標題欄按鈕、標題欄顯示風格、邊框風格各不相同。而對於具體的Java窗口內部Swing和AWT控件,其生成和顯示是由Java虛機自己來完成的,跟具體操做系統無關。因爲圖一、二、3中Java窗口標題欄部分中文顯示正常,代表XWindow已經可以支持中文的顯示,能夠初步排除XWindow配置的問題。所以,下邊的分析主要針對Java環境字體配置進行。測試

在Java平臺中,字體配置信息主要定義於font.properties系列文件中,存放於JRE/lib目錄下。其中定義了五種平臺無關的邏輯字體:Serif, SansSerif, Monospaced, Dialog和DialogInput,每個JVM的實現,都必須包含這五種字體。另外,還定義了邏輯字體跟實際字體的映射等信息。爲了支持不一樣的操做系統版本和Locale,font.properties包含了附帶不一樣後綴的多個版本。

從Sun的文檔"Adding Fonts to the Java Runtime"[參見參考文獻1]中,咱們能夠得知: 在英文環境下,字體屬性由無後綴的font.properties 定義。爲了一些操做系統的特殊問題,字體屬性文件的名字能夠加入操做系統的版本號做爲後綴。例如,Solaris 2.5.1 不支持 TrueType 字體,因此字體屬性文件font.properties.5.5.1 將只包含 F3 字體。在大多數操做系統中,版本後綴的值由System.getProperty("os.version")來肯定。

若是環境是日文、韓文、簡體中文或繁體中文,就必須使用相應於特定環境的 font.properties 文件。這些文件能夠經過文件名後邊加上相應的國家或者locale後綴識別,格式爲font.properties.<locale>。該<locale>實際上由<language>_<region>_<encoding>三部分構成。而<language>、<region>和<encoding>分別對應了系統屬性(由System.getProperty方法返回的字符串)"user.language"、"user.region"和"file.encoding"。而這個font.properties.<locale>名也能夠跟操做系統的版本結合使用。

歸納的講,Java按照如下順序搜索字體屬性文件:

font.properties.<language>_<region>_<encoding>.<osVersion>
font.properties.<language>_<region>_<encoding>
font.properties.<language>_<region>.<osVersion>
font.properties.<language>_<region>
font.properties.<language>_<encoding>.<osVersion>
font.properties.<language>_<encoding>
font.properties.<language>_<osVersion>
font.properties.<language>
font.properties.<encoding>.<osVersion>
font.properties.<encoding>
font.properties.<osVersion>
font.properties
                

 

爲了肯定United Linux下使用的字體屬性文件,咱們寫了如下的程序:

public class PrintLocale {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.language"));
        System.out.println(System.getProperty("user.region"));
        System.out.println(System.getProperty("file.encoding"));
        System.out.println(System.getProperty("os.version"));
    }
}
                

 

其執行過程及結果以下所示:

linux:/opt/WebSphere/AppServer/java/bin # ./java PrintLocale
zh
CN
GB2312
2.4.19-4GB
linux:/opt/WebSphere/AppServer/java/bin #
                

 

經過該執行結果、以及與JRE/lib目錄下的Java字體屬性文件名的比較,咱們能夠肯定,在United Linux 1.0中文環境下,選用的字體文件是font.properties.zh。

通過對font.properties.zh的檢查,咱們能夠發現如下幾行:

filename.song_medium_r=gkai00mp.ttf
filename.song_medium_i=gkai00mp.ttf
filename.song_bold_r=gkai00mp.ttf
filename.song_bold_i=gkai00mp.ttf
filename.fangsong_medium_r=gkai00mp.ttf
filename.fangsong_medium_i=gkai00mp.ttf
filename.fangsong_bold_r=gkai00mp.ttf
filename.fangsong_bold_i=gkai00mp.ttf
filename.kai_medium_r=gkai00mp.ttf
                

 

它主要用來指定邏輯字體名跟實際物理字體名之間的映射。而所指定的物理字體gkai00mp.ttf在WAS安裝目錄/java/jre/lib/fonts並不存在。

這就是問題的根源!

第三部分:問題解決

通過以上的分析,咱們能夠得知中文字符顯示錯誤,是由於font.properties.zh中指定的字體丟失引發的。兩種可能的修改方法以下:

方法一:

將一個符合要求的TTF字體文件拷貝到jre/lib/fonts目錄下,更名成gkai00mp.ttf便可。

例如,在United Linux 1.0下,能夠作如下操做:

cd /usr/lib/X11/fonts/truetype/
cp hya6gb3.ttf /opt/WebSphere/AppServer/java/jre/lib/fonts
cd /opt/WebSphere/AppServer/java/jre/lib/fonts
mv hya6gb3.ttf gkai00mp.ttf
                

 

方法二:

打開 font.properties.zh,將對gkai00mp.ttf的引用替換成對操做系統中實際存在的字體引用,而且在font.properties.zh中加上該字體的路徑,作法以下:

(1) 打開font.properties.zh

(2) 將"gkai00mp.ttf"全文替換成"hya6gb3.ttf"(共九處)

(3) 在該文件末尾加上一行:appendedfontpath=/usr/lib/X11/fonts/truetype

以上只修改了WAS安裝目錄下Java子目錄中的虛機,解決了WAS的一些工具界面上的亂碼問題。而對於安裝和卸載界面上的亂碼,修改方法相同,只是對應虛機路徑有所改變,分別是"安裝程序根目錄/jdk"和"WAS安裝目錄/_uninst/_jvm"


第四部分:問題測試

修改完畢後,在WAS安裝目錄下的bin目錄分別運行assembly.sh和firststep.sh,便可獲得如下的運行界面:


圖 5 正常的應用程序組裝工具界面
圖 5 正常的應用程序組裝工具界面

圖 6 正常的FirstStep程序界面
圖 6 正常的FirstStep程序界面

相關文章
相關標籤/搜索