【发布时间】:2020-12-26 13:03:16
【问题描述】:
我正在尝试显示老挝语文本:
ຄິ້ງເຄັງສາຍພານ
在Java swing 中的JLabel 中使用从following link 获得的示例代码。
选择的字体是 DokChampa。但是,显示的文本是:
请注意,字母表上方的字符被移位并向右移动。但是,使用 DokChampa 字体在记事本或系统中的其他编辑器中输入的相同文本可以正确显示。
当使用 Windows 支持的老挝语键盘在 JTextField 中完成数据输入时,行为是相同的。
其他类似LaoUI 的字体在Java Swing 组件中也有同样的行为
使用 JDK 1.8.0_152。我的示例程序如下。预期的输出是看到上面提到的显示的文本。
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class TestLaos {
public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
JLabel l = new JLabel();
String [] lstr = GraphicsEnvironment.getLocalGraphicsEnvironment ().getAvailableFontFamilyNames();
Font [] fList = new Font [lstr.length];
for (int i = 0; i <lstr.length; i ++)
{
fList [i] = new Font (lstr [i], Font.PLAIN, 20);
}
String rawString = new String("ຄິ້ງເຄັງສາຍພານ");
l.setText(rawString);
Font f = l.getFont ();
if (f.canDisplayUpTo (rawString)!=-1)
{//Find fonts that can not be displayed, then find available fonts
for (int i = 0; i <fList.length; i ++)
{
if (fList [i] .canDisplayUpTo (rawString) ==-1 && fList [i].getFontName().startsWith("DokChampa"))
{
System.out.println("Using font " + fList [i].getFontName() + " to display " + rawString);
l.setFont (fList [i]);
break;
}
}
}
JOptionPane.showMessageDialog(null, l);
}
});
}
}
【问题讨论】:
-
还有你用的是什么JDK版本?
-
JDK版本为1.8.0_152
-
添加 MRE 的不错! OTOH a) 并非所有 PC 都会安装 DokChampa 字体,并且.. b) 代码在此处使用 Arial Unicode MS 显示相同的(实际上是 even worse)行为。
-
使用 1.8.0_261,我得到了类似的转移 image;与 JavaFX 类似的结果;
stdout上什么都没有; Lucida Grande 字体为 Swing 默认; NetBeans 8.2 编辑器显示偏移,但 BBEdit 显示正确。 -
@trashgod 似乎具有多种不同字体的各种 JRE(使用 Swing 或 Java-FX)无法正确显示老挝字形。 :( 我猜问题出在 Java 上,而不是字体。