LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 704|回复: 0

[原创]彻底解决linux下java中文问题

[复制链接]
发表于 2005-11-8 22:53:40 | 显示全部楼层 |阅读模式
loveboylxy@bmy原创

   可能很多朋友都遇到过linux下java中文问题.常见情况就是图形界面中的中文都显示为方框,比如安装DB2数据库,
WebSphere等软件.这是一个很头痛的问题.我在网上搜索了大量的关于解决java中文问题的文章,结合自己摸索,实践,
试了几十次,基本解决了linux下java中文问题,包括jdk1.4和1.5的.现在总结出来,供大家参考.

   操作系统:  Mandriva 2006  limited Editon
   JDk版本 :  jdk1.4,jdk1.5

   jdk1.5的解决办法

   先看下面这篇文章,这篇文章在网上很容易搜索到:

================================================================================================================
  Sun JRE 1.5.0版的中文字体设置   
  2004年 10月29日   
    Sun公司的JRE(JAVA运行库)1.5.0版采用的字体设置方案跟1.4.2版的相去甚远。如果设置不当,Java程序中的中文会表现为方格。
    本文给出了一般性的字体设置方法,并且在最后给出了本机测试通过的字体配置文件以供下载。

    首先介绍一下其字体配置文件的加载方案。其加载顺序为(JavaHome指JRE的根目录,下同):
        JavaHome/lib/fontconfig.OS.Version.properties
        JavaHome/lib/fontconfig.OS.Version.bfc
        JavaHome/lib/fontconfig.OS.properties
        JavaHome/lib/fontconfig.OS.bfc
        JavaHome/lib/fontconfig.Version.properties
        JavaHome/lib/fontconfig.Version.bfc
        JavaHome/lib/fontconfig.properties
        JavaHome/lib/fontconfig.bfc
    其中,OS字段可以是:
    Windows: "98", "2000", "Me", "XP", "2003"。
    Solaris:空。
    Linux: "Sun", "RedHat", "Turbo", "SuSE"。
    而Version字段指该OS的版本号。

    在这些配置文件中,仅.properties文件是文本文件。其格式跟JRE1.4.2版的不同。文件分为几段,并在每段开始时标明。
    我们需要关注的仅有两段:Component Font Mappings和Search Sequences。
    前者指定字体,后者指定要使用的properties的搜索顺序。
    知道了这些,配置起来就简单了。

    首先,必须先把字体文件(这里用宋体Simsun.ttf)拷贝到JRE的字体目录JavaHome/lib/fonts下,
南市 然后编辑字体目录下的文件fonts.dir,把第一行的数字加1,然后在最后加一行,写上:
    simsun.ttf -SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0

    然后保存。

    然后,转到目录JavaHome/lib下,随便找一个.properties.src文件,用文本编辑器打开,并编辑如下:

# @(#)linux.fontconfig.SuSE.properties    1.2 03/10/17
#
# Copyright 2003 Sun Microsystems, Inc. All rights reserved.
#

# Version

version=1

# Component Font Mappings

serif.plain.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
serif.bold.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
serif.italic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
serif.bolditalic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
sansserif.plain.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
sansserif.bold.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
sansserif.italic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
sansserif.bolditalic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
monospaced.plain.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
monospaced.bold.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
monospaced.italic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
monospaced.bolditalic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialog.plain.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialog.bold.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialog.italic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialog.bolditalic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialoginput.plain.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialoginput.bold.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialoginput.italic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0
dialoginput.bolditalic.zh-1=-SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1988-0

# Search Sequences

sequence.allfonts=zh-1

# Exclusion Ranges

# Font File Names

    然后按照上面所述的文件名格式保存在这个目录下。Redhat系统的就保存为fontconfig.RedHat.properties,
WindowsXP的就保存为  fontconfig.XP.properties,以此类推。

    现在,启动Java程序看看,漂亮的JRE1.5的中文界面是不是出来了?
================================================================================================================

需要说明几点:

1,文中所有JavaHome/lib/*都应该是JavaHome/jre/lib/*.比如我的jdk安装目录jdk1.5.0_03
刚它提到的那些文件或目录都应该是jdk1.5.0_03/jre/lib/fontconfig.bfc,而不是jdk1.5.0_03/lib/fontconfig.bfc

2.
文章前面那段说明字体文件加载顺序, 其实可以不必理会.它说到的: Linux: "Sun", "RedHat", "Turbo", "SuSE",
如果不是这几个版本的linux呢?比如我的mandriva linux,如果改成        

JavaHome/lib/fontconfig.mandriva .properties

JavaHome/lib/fontconfig.mandriva .bfc
好像不行.所以我的做法是这样的:
   在JavaHome/lib目录下新建一个bak目录,把所有fontconfig.*文件全部移到bak目录,只留一个fontconfig.properties文件.
因为它按上文中那个顺序搜索,其它文件都没有,那就一定只有加载JavaHome/jre/lib/fontconfig.properties这个文件了.
所有的修改都是针对这个文件.

3,简单地说,修改过程如下
   复制widnows下的simsun.ttf到Java_Home/jre/lib/fonts/目录下,用ln命令建一个链接也可以.如果windows下是simsun.ttc,
可以直接改成 simsun.ttf  .
   把其它fontconfig.*文件移到bak目录备份,修改Java_Home/jre/lib/fontconfig.properties文件,内容改成上文中的配置文件
(直接复制那段文字过去就行).



   对于jdk1.4的解决

   虽然我喜欢用最新的jdk1.5,但很多软件还在使用jdk1.4,如IBM DB2 V8.2.对1.4的解决方案类似.注意以下几点区别:

   1.把Java_Home/jre/lib/font.properties.*文件移到bak目录,只留下font.properties.zh_CN.Redhat,我试了N次,
发现1.4就是加载这个字体配置文件.其它版本的linux,如果保留这个文件不行,可以试一下保留成其它文件名.
   2.在Java_home/jre/lib/fonts/fonts.dir把第一行的数字加1,最后加一行,
simsun.ttf -misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1
注意这一行与jdk1.5的不同.
   3.字体配置文件与1.5也不同,应修改成如下


# @(#)font.properties.zh.Turbo.linux        1.4 02/06/10
#
# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
#

# Component Font Mappings
#
serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.italic.0=-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.bold.0=-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.bolditalic.0=-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.0=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.italic.0=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.bold.0=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.bolditalic.0=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1
sansserif.bolditalic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.italic.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.bold.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.bolditalic.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
monospaced.bolditalic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.0=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.italic.0=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.bold.0=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.bolditalic.0=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1
dialog.bolditalic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.italic.0=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.bold.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.bolditalic.0=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1
dialoginput.bolditalic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

# Missing Glyph Character
#
default.char=274f

# Component Font Character Encodings
#
fontcharset.serif.0=sun.io.CharToByteISO8859_1
fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK

fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK

fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK

fontcharset.dialog.0=sun.io.CharToByteISO8859_1
fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK

fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK

# Exclusion Ranges
#

# XFontSet Information
#
fontset.serif.plain=\
-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.italic=\
-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bold=\
-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bolditalic=\
-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1
fontset.sansserif.plain=\
-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.italic=\
-b&h-lucida-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bold=\
-b&h-lucida-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bolditalic=\
-b&h-lucida-bold-i-normal-snas-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.plain=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.italic=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bold=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-,1\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bolditalic=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.italic=\
-b&h-lucida-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bold=\
-b&h-lucida-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bolditalic=\
-b&h-lucida-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.plain=\
-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.italic=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bold=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bolditalic=\
-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.plain=\
-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.default=\
-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1,\
-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-iso10646-1


appendedfontpath=/mnt/win_c/winnt/Fonts/




  现在可以试一下,中文是不是出来了.

  对其它中文问题的解决:
  比如安装DB2过程中,安装的界面中文就是方框.如果你是硬盘安装,你会发现DB2安装源文件的目录下有一个jre目录,
安装过程中使用的就是这个jre.如果你已经把其它jdk1.4的问题解决了.就可以把这个jre文件夹删了,
把你已经解决中文问题的那个jre目录复制到这个目录.DB2安装好以后,可以修改DB2安装目录下的jdk,因为DB2等软件都是使用
自带的ibm-jdk1.4.1,不过跟sun的jdk,区别不大,同样修改.

  Jbuilder界面的中文问题也可以类似的解决,可以修改jbuilder安装目录下的jdk1.4目录中的配置文件.



  注:本文只是技术上的探讨,对simsun.ttf字体的版权问题不予考虑.解决过程中,发现问题,欢迎和我讨论.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表