第一部分:问题描述

当WebSphere Application Server(以下简称为WAS)安装到中文Linux平台时,经常出现中文被显示为方块的情况,如下图所示:

图 1 应用程序组装工具乱码现象

图 2 FirstStep程序乱码现象

本文以在United Linux1.0下配置WebSphere Application Server 5.0 Base版本为例,描述了定位及解决中文显示乱码问题的过程。

第二部分:问题定位

Linux下Java程序界面中中文显示的问题,经常存在于XWindow配置、Java程序内部错误和Java环境配置等几个方面。为了辅助进行错误定位,我们可以写一个简单的Swing程序,如下所示:

//在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平台上,其运行结果如下所示:

图 3 United Linux 1.0运行结果

图 4 Windows 2000中文版运行结果

由于Windows平台下程序运行正常,说明该测试程序在汉字显示代码上的编写没有问题。而该测试程序在United Linux 1.0上的错误现象,跟图1、2一致,因此错误可能在XWindow配置和Java环境配置上。

而在Java虚机实现时,Java程序窗口的生成是通过调用操作系统API来完成的,跟具体操作系统相关。因此,同样的Java程序窗口在不同操作系统上,其标题栏按钮、标题栏显示风格、边框风格各不相同。而对于具体的Java窗口内部Swing和AWT控件,其生成和显示是由Java虚机本身来完成的,跟具体操作系统无关。由于图1、2、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 正常的应用程序组装工具界面

图 6 正常的FirstStep程序界面

转载于:https://blog.51cto.com/river7000/411008

WebSphere Application Server 5.0在Linux平台上中文界面乱码问题的解决相关推荐

  1. IBM WebSphere Application Server 9.0.0.2 部署Spring Boot 2.x

    IBM WebSphere Application Server 9.0.0.2 部署Spring Boot2.x 项目 目录 1:创建JDBC 提供程序 2:创建数据源 3:创建数据源认证信息(JA ...

  2. php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法

    本文实例分析了php版微信公众平台回复中文出现乱码问题的解决方法.分享给大家供大家参考,具体如下: 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决 ...

  3. 微信nickname乱码 php,php版微信公众平台回复中文出现乱码问题的解决方法

    本文实例分析了php版微信公众平台回复中文出现乱码问题的解决方法.分享给大家供大家参考,具体如下: 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决 ...

  4. IBM DB2 Alphablox 8.3 build 149 安装过程 部署 WebSphere Application Server 6.0.1上

    IBM DB2 Alphablox 8.3 build 149 安装过程 信息 已将 DB2 Alphablox 配置为连接到 DB2 OLAP Server v8.1/Essbase Server ...

  5. IBM WebSphere Application Server与IBM Java V8官方帮助文档资源汇总

    对于从事To C领域的工作小伙伴来说,日常使用的可能就是Oracle的Java和Tomcat,然而对于从事To B行业,尤其是银行业的小伙伴来说(笔者目前从事To B行业),可能在开发完项目以后,在客 ...

  6. 为WebSphere Application Server开发企业OSGi应用程序

    与软件开发相关的绝大多数成本与新应用程序的初始设计,开发和测试无关-尽管这些成本可能很高-但与此后应用程序的维护和发展无关. 通过仅通过定义明确的接口访问的一致,版本化,可重用的模块设计和构建应用程序 ...

  7. 用C读取INI配置文件 (可在linux平台上用)

    /*c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux ...

  8. IBM WebSphere Application Server 诊断和调优(07年写的,原JavaEye精华帖)

    这是[url=http://zwchen.iteye.com/blog/646063]上篇文章[/url]的续篇,也是07年初发表于JavaEye,被评为精华帖,浏览近四万次,也被各大IT媒体转载(g ...

  9. IBM WebSphere Application Server 诊断和调优

    近段时间,我们项目中用到的WebSphere应用服务器(WAS),但在客户的production环境下极不稳定,经常宕机.给客户造成非常不好的影响,同时,也给项目组很大压力.为此,我们花了近一个月时间 ...

最新文章

  1. Elasticsearch 在互联网公司大量真实的应用案例
  2. 2020 操作系统第二次习题
  3. Linux下Socket 函数集(三)
  4. 使用PCL::GPU::遇到问题
  5. php开发地图导航,php 实现百度地图(很详细出来的地图)
  6. “单口相声”回归!罗永浩要开发布会了:黑科技!不售票!
  7. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
  8. 苏格拉底的“灵魂”的哲学意味
  9. Bootstrap元素居中
  10. 「前端早读君008」新手必踩坑之display: inline-block
  11. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之享元模式
  12. Centos7 SGE安装部署
  13. 关于微信开放平台授权事件接收Url的配置以及参数接收
  14. 深度讲解VIEWPORT和PX是什么
  15. excel切片器显示错误_使用切片器在Excel中设置过滤条件
  16. 歌尔2718硅咪 超小体积 S15OB383-058 S15OB381-055 S15OT421-001
  17. Java手动释放内存
  18. 科技云报道:让入职效率翻倍,数字认证电子签为滴滴“加速”
  19. 全国所有飞机场机场信息
  20. JAVA中的糕富帅技术

热门文章

  1. ActiveMQ_基础学习
  2. YII中session和cookie
  3. PHP单元测试使用手册
  4. Android源代码下载方法具体解释
  5. google圣诞节彩蛋
  6. CCNA第二学期中文final
  7. AIX操作系统启动详细介绍
  8. 中文分词工具jieba中的词性类型(转载)
  9. (error) ERR wrong number of arguments for 'hmget' command
  10. No changes detected解决方案