我在《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下的差異就可解決了,雖然方法有點笨,但問題還是解決了。
如果有更好的方法,希望不吝賜教,共同進步。