(部分参阅了网络上其他人的文档)
apache的batik是一个处理svg的库, 本人本打算拿它来作一个过滤的servlet,在浏览器不支持svg的情况下,自动画个png图形送到客户端。本来以为是很简单的事情,但是....郁闷,这个问题搞掉了我2天时间, 现在回想起来, 这个问题前后出错的原因不一样,但是导致的问题缺相似,导致我主观的认为两个错误是同样原因引起的, 浪费了大量时间去检查. 一开始画图,中文是??? ,不用说,一定是中文编码问题, fix了, 然后又绘图,看上去正常了,不过正式运行以后发现,图形中部分中文文字显示不出来,为"口口", 我以为还是编码问题, 埋头扎进batik, 检查了半天,没有看到哪里对编码作了不当处理, 最后一路检查到graphics2d.drawXXX, 实在是没有办法了, 再下去就是native code了, 于是我回头又检查了一遍,还是不行,几乎放弃了。 今天早上来心情好,突然想到会不会是jdk的bug, 于是动手写了个jsp,代码如下
GraphicsEnvironment ge
=
GraphicsEnvironment.getLocalGraphicsEnvironment();
String fontNames[]
=
ge.getAvailableFontFamilyNames();
String path
=
application.getRealPath(
"
/client
"
)
+
"
/test
"
;
//
Iterate the font family names
for
(
int
i
=
0
; i
<
fontNames.length; i
++
) {
String fontName
=
fontNames[i];
out
.print(fontName);
BufferedImage bufferedImage
=
new
BufferedImage(
400
,
400
,BufferedImage.TYPE_3BYTE_BGR);
Graphics big
=
bufferedImage.createGraphics();
big.setFont(
new
Font(fontName,Font.PLAIN,
30
));
big.drawString(
"
你好,发送到A
"
,
100
,
100
);
OutputStream os
=
new
FileOutputStream(path
+
"
/
"
+
fontName
+
"
.jpg
"
);
JPEGImageEncoder encoder
=
JPEGCodec.createJPEGEncoder(os);
encoder.encode(bufferedImage);
os.close();
}
用系统列出来所有字体画一遍图,然后一个一个看,果然,问题找到了
1没有simsun字体!汗~~~,原来能画出来的那些部分中文用的不知道是什么字体。
2 情况和batik一样,部分中文绘制不出来,为方框
上网google了一下, 发现原来jdk5.0在linux下和以前的版本还不一样,默认不支持中文字体的。得手动去搞一个fontconfig配置, 此文件在$JAVA_HOME/jre/lib/下, 果然有一大堆fontconfig.XX.properties, 官方的解释在
这里, 懒得看那么多,直接搞一个自己的,先从windows上拷贝simsun.ttc到lib下面的fonts目录下
然后自己编一个简单的
# @(#)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
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
serif.bold.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
serif.italic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
serif.bolditalic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
sansserif.plain.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
sansserif.bold.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
sansserif.italic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
sansserif.bolditalic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
monospaced.plain.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
monospaced.bold.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
monospaced.italic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
monospaced.bolditalic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialog.plain.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialog.bold.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialog.italic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialog.bolditalic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialoginput.plain.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialoginput.bold.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialoginput.italic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
dialoginput.bolditalic.zh
-
1
=
Simsun GB
-
medium
-
r
-
normal
--
0-0-0-0-c-0-gb2312.1988-0
# Search Sequences
sequence.allfonts
=
zh
-
1
# Exclusion Ranges
# Font
File
Names
取名为fontconfig.RedHat.properties 中间的名字是操作系统名,如Redhat系统的就保存为fontconfig.RedHat.properties,WindowsXP的就保存为fontconfig.XP.properties,以此类推。
重新启动java, 搞定
教训
- 不要轻易使用不熟悉的第三方库
- 遇到问题,不要专牛角尖,适当的时候放一放
- google不好用的时候不要调试第三方库