WebSphere Application Server 5.0在Linux平台上中文界面乱码问题的解决
第一部分:问题描述
当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平台上中文界面乱码问题的解决相关推荐
- 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 ...
- php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法
本文实例分析了php版微信公众平台回复中文出现乱码问题的解决方法.分享给大家供大家参考,具体如下: 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决 ...
- 微信nickname乱码 php,php版微信公众平台回复中文出现乱码问题的解决方法
本文实例分析了php版微信公众平台回复中文出现乱码问题的解决方法.分享给大家供大家参考,具体如下: 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决 ...
- 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 ...
- IBM WebSphere Application Server与IBM Java V8官方帮助文档资源汇总
对于从事To C领域的工作小伙伴来说,日常使用的可能就是Oracle的Java和Tomcat,然而对于从事To B行业,尤其是银行业的小伙伴来说(笔者目前从事To B行业),可能在开发完项目以后,在客 ...
- 为WebSphere Application Server开发企业OSGi应用程序
与软件开发相关的绝大多数成本与新应用程序的初始设计,开发和测试无关-尽管这些成本可能很高-但与此后应用程序的维护和发展无关. 通过仅通过定义明确的接口访问的一致,版本化,可重用的模块设计和构建应用程序 ...
- 用C读取INI配置文件 (可在linux平台上用)
/*c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux ...
- IBM WebSphere Application Server 诊断和调优(07年写的,原JavaEye精华帖)
这是[url=http://zwchen.iteye.com/blog/646063]上篇文章[/url]的续篇,也是07年初发表于JavaEye,被评为精华帖,浏览近四万次,也被各大IT媒体转载(g ...
- IBM WebSphere Application Server 诊断和调优
近段时间,我们项目中用到的WebSphere应用服务器(WAS),但在客户的production环境下极不稳定,经常宕机.给客户造成非常不好的影响,同时,也给项目组很大压力.为此,我们花了近一个月时间 ...
最新文章
- Elasticsearch 在互联网公司大量真实的应用案例
- 2020 操作系统第二次习题
- Linux下Socket 函数集(三)
- 使用PCL::GPU::遇到问题
- php开发地图导航,php 实现百度地图(很详细出来的地图)
- “单口相声”回归!罗永浩要开发布会了:黑科技!不售票!
- 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
- 苏格拉底的“灵魂”的哲学意味
- Bootstrap元素居中
- 「前端早读君008」新手必踩坑之display: inline-block
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之享元模式
- Centos7 SGE安装部署
- 关于微信开放平台授权事件接收Url的配置以及参数接收
- 深度讲解VIEWPORT和PX是什么
- excel切片器显示错误_使用切片器在Excel中设置过滤条件
- 歌尔2718硅咪 超小体积 S15OB383-058 S15OB381-055 S15OT421-001
- Java手动释放内存
- 科技云报道:让入职效率翻倍,数字认证电子签为滴滴“加速”
- 全国所有飞机场机场信息
- JAVA中的糕富帅技术