我在《JAVA下取得字符串像素宽度例子》中大体介绍了判断和截取字符串的像素宽度,在使用的过程中发现了以下问题:
在windows下和在Linux下同样的条件下取得的字串宽度不同(主要是针对半角),查了N多资料也没有找到比较好的解决办法。后来灵光一闪,是不是可以找一对字体使得在windows和linux下取得的像素宽度大致相同。经测试发现windows(XP)下使用Arial,Linux下使用Luxi Sans,绝大部分字符的宽度是相同的,只有下面几个稍有差异。
○ AMVXYvxyz^ windows = linux - 1
○ ms windows = linux + 1
因此,如果server运行在Linux环境下,可以这样解决之。
原来source中
private static Font f = new Font("Arial", Font.PLAIN, 12);
// 判断是否是全角字符,半角使用英文字体,全角使用日文字体进行计算宽度
if (tmpChar.getBytes().length == 1) {
chr_width = fm.stringWidth(tmpChar);
} else {
chr_width = jpfm.stringWidth(tmpChar);
}
⇒ private static Font f = new Font("Luxi Sans", Font.PLAIN, 12);
// 判断是否是全角字符,半角使用英文字体,全角使用日文字体进行计算宽度
if (tmpChar.getBytes().length == 1) {
chr_width = fm.stringWidth(tmpChar);
if("AMVXYvxyz^".indexOf(tmpChar) > 0) {
chr_width -= 1;
} else if("ms".indexOf(tmpChar) > 0) {
chr_width += 1;
}
} else {
chr_width = jpfm.stringWidth(tmpChar);
}
这样Windows下和Linux下的差异就可解决了,虽然方法有点笨,但问题还是解决了。
如果有更好的方法,希望不吝赐教,共同进步。