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程序界面

相关文章
相关标签/搜索