- 浏览: 299568 次
- 性别:
- 来自: 湖南
文章分类
最新评论
-
lliiqiang:
枚举类型可以在父类中根据instanceof强制判断是否是指定 ...
JEditorPane显示HTML中文乱码 -
jiangsulane911:
下载了你提供的文件,解压后将RXTXcomm.jar 放到 ...
运行在 mac 10.6 上出现的异常 -
hxcan:
非常感谢。
linux 启用root用户登录 -
wshxx998:
请问你的在配置SDK路径的时候使用的是root帐号还是普通帐号 ...
android sdk linux 1.5 安装与配置 -
finux:
不如使用JFormattedTextField.setForm ...
JTextField 只能输入限定的数字
第二部分:问题定位
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按照以下顺序搜索字体属性文件:
为了确定United Linux下使用的字体属性文件,我们写了以下的程序:
其执行过程及结果如下所示:
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"
字库就是字型库(FONT LIBRARY),其实计算机上显示的每个字符(不管它是哪种语言的),都是一个小的图案。字库就是把这些小的图案以图片的某种形式保存起来,需要显示的时候还原出来就可以了。在WINDOWS操作系统里的字库存放在系统盘windows\fonts文件夹下,在linux操作系统中字库存放在这/usr/share/fonts/文件夹下。
3 Java语言中产生乱码的原因及解决方法
3.1基于awt(swing)的图形界面程序中文显示乱码
基于awt(swing)的图形界面程序中,一般会出现菜单中的中文显示乱码,其原因一般是JVM找不到用来显示中文的字库,JVM在原始的安装下是没有中文字库的,而linux的发行版本又各不相同,其字库存放的路径和名字又各不相同,所以JVM一般是找不到linux操作系统内带的字库,解决方法是让JVM能找到linux操作系统内带的字库,如在Redflag 6.0下可以通过下面命令解决:
mkdir /usr/java/jdk1.6.0/jre/lib/fonts/fallback
ln -s /usr/share/fonts/chinese/TrueType/*.ttf /usr/java/jdk1.6.0/jre/lib/fonts/fallback
一般不需要修改JRE/lib/目录下的字体配置文件(fontconfig.OS.Version.properties)。
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"
字库就是字型库(FONT LIBRARY),其实计算机上显示的每个字符(不管它是哪种语言的),都是一个小的图案。字库就是把这些小的图案以图片的某种形式保存起来,需要显示的时候还原出来就可以了。在WINDOWS操作系统里的字库存放在系统盘windows\fonts文件夹下,在linux操作系统中字库存放在这/usr/share/fonts/文件夹下。
3 Java语言中产生乱码的原因及解决方法
3.1基于awt(swing)的图形界面程序中文显示乱码
基于awt(swing)的图形界面程序中,一般会出现菜单中的中文显示乱码,其原因一般是JVM找不到用来显示中文的字库,JVM在原始的安装下是没有中文字库的,而linux的发行版本又各不相同,其字库存放的路径和名字又各不相同,所以JVM一般是找不到linux操作系统内带的字库,解决方法是让JVM能找到linux操作系统内带的字库,如在Redflag 6.0下可以通过下面命令解决:
mkdir /usr/java/jdk1.6.0/jre/lib/fonts/fallback
ln -s /usr/share/fonts/chinese/TrueType/*.ttf /usr/java/jdk1.6.0/jre/lib/fonts/fallback
一般不需要修改JRE/lib/目录下的字体配置文件(fontconfig.OS.Version.properties)。
发表评论
-
vsftpd 搭建 - 添加用户
2010-08-24 21:02 1955纲要: 一, VsFTPd的简述 二, 企业Linux下vsF ... -
linux 打开pdf 文件
2010-07-16 21:19 1845... -
Fedora Core 5.0 中添加字体及应用程序字体设置方法
2010-05-19 23:35 1698Fedora Core 5.0 中添加字体及应用程序字体设置方 ... -
Fedora文字模式界面下安装中文字体
2010-05-19 23:34 2277FC9安装simsun字体,将windows下的字体simsu ... -
MAC OS X DNS 服务器
2010-04-23 22:19 1494要查明您应该使用哪个 DNS 服务器,请联系您的 ISP 或网 ... -
ssh demo
2010-02-01 23:03 1649ssh demo war包 自己保存使用 -
linux下mysql乱码问题
2010-02-01 22:45 956和windwos中的Mysql一樣,默認的設置都是latin1 ... -
Linux下Tomcat的安装
2010-01-31 22:19 987Linux下Tomcat的安装 可 ... -
下载MySQL的安装
2010-01-31 22:10 1228二、安装Mysql 1 ... -
VNCServer 配置 及Vncview的使用
2010-01-08 00:06 4165VNCServer 配置 及Vncview的 ... -
Linux中的远程连接
2010-01-07 23:21 1556我们知道在windows下面我 ... -
linux下安装输入法 ibus
2010-01-07 21:57 3154在fedora 下安装 ibus 网上的大鸟给误导了说什么 ... -
VNC Server 在 Linux 下的安裝
2009-11-30 23:56 2306遠端控制一直是個理想的工作目標,你不但可以在本機使用電腦,在離 ... -
SSH 连接 Ubuntu 时的中文乱码问题
2009-11-21 09:30 2527若使用 Ubuntu 中文系统,其默认将使用 UTF-8 作为 ... -
Ubuntu服务器上SSH Server 的安装和设置
2009-11-21 09:28 25551.在sshd的设置文件/etc/ss ... -
JNI 调用demo
2009-11-17 21:57 1362Here is the quick overview of t ... -
android sdk linux 1.5 安装与配置
2009-11-15 01:55 84371.下载android sdk 下载地址如下: http:// ... -
linux 启用root用户登录
2009-09-25 23:55 65233Ubuntu Linux有一个与众不同的特点,那就是初次使用时 ... -
在Windows上构建Linux系统——后传二:用光盘部署目标系统
2009-09-08 23:55 1426在部署用Windows系统构建 ... -
linux 问题 mkisofs
2009-09-07 21:17 2126apt -get install mkisofs The pr ...
相关推荐
### Swing中文乱码问题(Linux和Windows) #### Linux系统下的解决方案 在Linux系统下使用Swing进行GUI开发时,可能会遇到中文乱码的问题。解决这一问题通常需要对系统的编码环境进行适当的配置。以下是一个详细的...
在Linux环境下运行Java Swing应用程序时,遇到中文乱码问题是一个常见的挑战。这通常源于系统编码、字体支持或Java运行环境的设置不当。本文将详细探讨Linux下Java Swing程序中文乱码的原因及解决方案,帮助开发者...
**JFreechart不显示问题** JFreechart在Linux环境下不显示可能是由于以下原因: 1. **Java版本不兼容**:不同的Linux发行版可能预装了不同版本的Java,而JFreechart可能对某些版本的Java支持不佳。确保使用...
在压缩包文件"SWING乱码font.zip"中,可能包含了用于解决Swing乱码问题的示例代码、自定义字体文件或其他相关资源。解压后,你可以根据提供的示例来调整你的Swing应用,确保文本的正确显示。如果遇到问题,可以通过...
标题 "AWT在Linux下的中文乱码" 涉及的是Java图形用户界面(GUI)开发中的一个问题,尤其是在非Windows操作系统环境下。AWT(Abstract Window Toolkit)是Java早期提供的一个用于创建GUI的基本库,它依赖于本地操作...
压缩包中的`simsun.ttc`文件是宋体的TrueType字体集合,它可能用于解决Java图形界面(如Swing或JavaFX)显示中文字符的问题。如果你的Java应用需要显示中文界面,确保已安装并加载了支持中文的字体,例如SimSun...
字体文件simsum.ttc,可以用于解决linux下面swing界面乱码问题。
这个文件可以用来解决JFreeChart在Linux下显示中文乱码的问题。 解决步骤如下: 1. **安装字体**:首先,你需要将“simsun.ttc”字体文件安装到你的Linux系统中。这通常涉及到将字体文件复制到系统的字体目录...
然而,当在Linux系统上运行含有中文或其他非ASCII字符的数据时,如果没有正确设置编码,就可能导致显示的图表出现乱码。 要解决这个问题,我们需要关注以下几个关键点: 1. **源代码编码**:确保你的Java源代码...
在Java编程中,文件路径处理是一项常见的任务,但当路径中包含中文字符或特殊字符时,可能会遇到乱码问题。本文将深入探讨这个问题,并提供一个简单的解决方案。 首先,我们需要理解为什么会发生路径乱码。Java在...
如果转换过程中出现问题,会导致中文显示为乱码。 3. **跨平台性**:Java的一个核心优势在于其跨平台特性,即“一次编写,到处运行”。但这也意味着Java程序需要能够在各种不同的操作系统和环境中运行,这增加了...
在Java Swing中,我们可以使用`javax.swing.JEditorPane`或`javax.swing.WebView`(在JavaFX中)来显示和操作Web内容。然而,`DocumentRenderer`可能是一个自定义的类,专门设计用来将Web页面内容转换为适合打印的...
当安装过程中显示的文本不是预期的语言或者出现无法识别的字符时,这表明字符集可能未正确设置。解决这个问题的方法是: 1. 在安装前,检查并确保你的系统环境变量`LANG`和`LC_ALL`已设置为支持所需语言的值。例如...
然而,这个方法在Windows下可以正常工作,在Linux中可能就不行了,具体是怎样的效果要看Linux使用的图形桌面环境(GNOME下背景是透明的,但是文字飘过后会留下痕迹,重绘也不行)。 对于第二个问题,因为没有统一的...
在这个五子棋游戏中,UTF-8编码确保了程序中的文本(如菜单、提示信息等)能够正确地显示各种语言的文字,避免了字符乱码问题。 2. **Java语言**: Java是一种跨平台的面向对象的编程语言,它的“一次编写,到处...
如果需要查看源码并进行编辑,开发者可能需要将文件转换为UTF-8编码,因为现代的开发工具通常默认使用UTF-8,这样能避免乱码问题。 游戏本身是由一系列类和对象组成的,这是Java面向对象编程的基础。我们可以假设...
- 国际化:在开发多语言应用时,使用UTF-8可以避免因编码问题引起的显示错误。 6. **注意事项**: - 转换过程中可能出现编码冲突,导致部分字符无法正确显示,此时需要人工干预或使用更高级的工具进行修复。 - ...
"乱码问题.txt"可能是开发者遇到编码问题时的记录,或者是对解决不同字符集下歌词显示问题的说明。JAVA处理字符编码主要依赖Charset类和InputStreamReader/OutputStreamWriter,确保正确地读写多语言文本。 总之,...
3. **数据编码**:确保正确设置数据编码,如ASCII或UTF-8,以防止数据传输过程中的乱码问题。 4. **硬件兼容性**:不同硬件设备的串口配置可能会有所不同,需要根据实际情况调整通信参数。 5. **性能优化**:根据...
10. Swing图形界面开发 11. JSP开发环境的搭建及其语法详解 12. 开发用户登录和注册系统 **第二阶段:零基础实战Mysql数据库应用开发** 此阶段共30课时,目的是让学生快速掌握MySQL的安装配置、高级用法以及安全...