现在的位置: 首页 > 综合 > 正文

linux平台上通过jfreechart生成的PNG图像中显示的汉字为方框的问题的解决

2013年06月26日 ⁄ 综合 ⁄ 共 6677字 ⁄ 字号 评论关闭

参考链接 
http://dev.csdn.net/develop/article/18/18432.shtm
http://www-Array00.ibm.com/developerWorks/cn/wsdd/library/techarticles/yangyaping0307/waslinux.shtml

出现这个问题的主要原因是SUN的JDK中默认带的font.properties不适合于我使用的系统平台
我的linux是Red Hat Enterprise Linux AS 3,默认系统语言LANG=en_us
首先我们需要将需要用到的字体文件拷贝到/usr/share/fonts目录下
字体文件可以从安装了中文字体的linux上拷过来
例如:我需要使用的是简体中文,那就要将/usr/share/fonts目录下的zh_CN全部拷到我的linux的相同目录下
然后运行一下下面这段小程序判断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"));

    }
}

我这里的运行结果是
en
null
ISO-885Array-1
2.4.21-4.EL
在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.。
该实际上由__三部分构成。
而、和分别对应了系统属性(由System.getProperty方法返回的字符串)"user.language"、"user.region"和"file.encoding"。
而这个font.properties.名也可以跟操作系统的版本结合使用。
概括的讲,Java按照以下顺序搜索字体属性文件:
font.properties.__.
font.properties.__
font.properties._.
font.properties._
font.properties._.
font.properties._
font.properties._
font.properties.
font.properties..
font.properties.
font.properties.
font.properties
根据上面的小程序的结果,可以判断我的linux使用的字体配置信息文件的文件名应该为font.properties.en
(当然,我没有写得很严格,目的是为了能更好的匹配,如果你的系统language是zh_CN,那你的字体配置信息文件的文件名就应该为font.properties.zh_CN)
在编辑字体配置信息文件之前,我们需要做以下工作
打开/usr/share/fonts/zh_CN/TrueType 下面的 font.dir文件,将其中我需要用的字体的名字copy出来,
例如:-misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1
然后按照java的字体规则改为 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1,记住这个字体的名字,我们下面将会用到
然后我们就编辑这个配置文件,你可以将JDK自带的配置文件copy一份,然后修改修改
我比较偷懒,就是这样做的 cp font.properties.zh_CN.Redhat8.0 font.properties.en
然后编辑它,将其中的字体名全部替换成 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
在文件的最后加上appendedfontpath=/usr/share/fonts/zh_CN/TrueType
要不然JDK/jre是找不到你的字体文件的
我修改好的font.properties.en如下:
# @(#)font.properties.zh.Redhat.linux 1.4 02/06/10
#
# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
#

# Component Font Mappings
#
serif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
# Missing Glyph Character
#
default.char=274f

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

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

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

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

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

# Exclusion Ranges
#

# XFontSet Information
#
fontset.serif.plain=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.italic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bold=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bolditalic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.plain=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.italic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bold=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bolditalic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.plain=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.italic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bold=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bolditalic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.italic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bold=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bolditalic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.plain=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.italic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bold=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bolditalic=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.plain=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

#fontset.default=
#-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso10646-1,
#-tlc-song-medium-r-normal--*-%d-*-*-c-*-gbk-0

fontset.default=
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

appendedfontpath=/usr/share/fonts/zh_CN/TrueType
然后编辑/etc/profile文件设置环境变量JAVA_FONTS为中文TrueType字体所在目录
export JAVA_FONTS=/usr/share/fonts/zh_CN/TrueType
最后使profile生效,然后重起tomcat
应该就OK啦


  • 以上内容由 华夏名网 搜集整理,如转载请注明原文出处,并保留这一部分内容。

  • 抱歉!评论已关闭.