Java:塑造蒙古语字形时出错
上下文:Java11、JavaFX11(如果适用)、LinuxMint19.3、Eclipse2020.06。Java应用程序作为桌面应用程序运行 背景:蒙古语脚本被认为是“复杂的”,为了正确塑造,需要OpenType表格,如Java:塑造蒙古语字形时出错,java,swing,javafx,opentype,Java,Swing,Javafx,Opentype,上下文:Java11、JavaFX11(如果适用)、LinuxMint19.3、Eclipse2020.06。Java应用程序作为桌面应用程序运行 背景:蒙古语脚本被认为是“复杂的”,为了正确塑造,需要OpenType表格,如isol,init,medi,fina,rlig,在实现它的字体中 我试图在JavaUI中插入蒙古语字符串,但在Swing和JavaFX中都得到了意想不到的结果 基本上,如果蒙古语字符串像“ᠪᠠᠢᠨᠠ" 仅插入SwingJLabel或Fx标签中,渲染时不进行任何整形(或多
isol
,init
,medi
,fina
,rlig
,在实现它的字体中
我试图在JavaUI中插入蒙古语字符串,但在Swing和JavaFX中都得到了意想不到的结果
基本上,如果蒙古语字符串像“ᠪᠠᠢᠨᠠ" 仅插入SwingJLabel
或Fx标签
中,渲染时不进行任何整形(或多或少与中相同)ᠪ ᠠ ᠢ ᠨ ᠠ),而如果在同一标签中添加了另一个“复杂”字符串中的字符串,则表示“अनुच्छेद ᠪᠠᠢᠨᠠ“或”ᠪᠠᠢᠨᠠ अनुच्छेद,则会正确渲染
此外,我注意到,在Swing中,Devanāgarī或阿拉伯语字符串的形状都是正确的,而在JavaFx中,Devanāgarī加法起作用,而阿拉伯语加法则不起作用
当然,我不能仅仅为了打开正确的整形而添加任意字符串。我是否忘记了一些重要的初始化,或者字体堆栈的Java整形层是否已损坏?(我想是HarfBuzz,它通常工作得很好…)
谢谢你的建议
Swing minimal示例,其中的注释显示哪些字符串正确呈现,哪些字符串不正确:
package com.vistamaresoft.swingtest;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main
{
private JFrame frame;
private static Main window;
public Main()
{
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setTitle("Mongolian Swing Test");
frame.setBounds(100, 100, 300, 200);
//Set up the GUI.
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JLabel label = new JLabel("ᠪᠠᠢᠨᠠ"); // NOT CORRECT
panel.add(label);
label = new JLabel("Abc ᠪᠠᠢᠨᠠ"); // NOT CORRECT
panel.add(label);
label = new JLabel("ᠪᠠᠢᠨᠠ كتاب "); // CORRECT
panel.add(label);
label = new JLabel("كتاب ᠪᠠᠢᠨᠠ"); // CORRECT
panel.add(label);
label = new JLabel("ᠪᠠᠢᠨᠠ अनुच्छेद"); // CORRECT
panel.add(label);
label = new JLabel("अनुच्छेद ᠪᠠᠢᠨᠠ"); // CORRECT
panel.add(label);
frame.setContentPane(panel);
}
public static void main(String[] args)
{
window = new Main();
window.frame.setVisible(true);
}
}
JavaFx最小示例。请注意,WebView
并不比标签
更好,将标签文本复制并粘贴到HTML输入字段会产生相同的结果:
package com.vistamaresoft.fxtest;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class Main
{
static final String html =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n\"http://www.w3.org/TR/html4/strict.dtd\">\n" +
"<html>\n<body>\n" +
"<p style='font-size: 18pt;'>Sample text: ᠴᠣᠴᠡᠭᠠ</p>" + // NOT CORRECT!
"<p style='font-size: 18pt;'>ᠪᠠᠢᠨᠠ كتاب </p>" + // NOT CORRECT!
"<p style='font-size: 18pt;'>अनुच्छेद ᠴᠣᠴᠡᠭᠠ</p>" + // CORRECT!
"<p><input type='text' name='title' size='20' maxlength='50' style='font-size: 18pt;' /></p>" +
"</body></html>\n";
public static void main(String[] args)
{
Application.launch(MainApp.class, args);
}
public static class MainApp extends Application
{
@Override public void start(Stage primaryStage) throws Exception
{
WebView webView = new WebView();
webView.getEngine().loadContent(html);
Label lab1 = new Label("ᠪᠠᠢᠨᠠ"); // NOT CORRECT
lab1.setStyle("-fx-font-size: 24pt;");
Label lab2 = new Label("ᠪᠠᠢᠨᠠ كتاب"); // NOT CORRECT
lab2.setStyle("-fx-font-size: 24pt;");
Label lab3 = new Label("كتاب ᠪᠠᠢᠨᠠ"); // NOT CORRECT
lab3.setStyle("-fx-font-size: 24pt;");
Label lab4 = new Label("ᠪᠠᠢᠨᠠ अनुच्छेद"); // CORRECT
lab4.setStyle("-fx-font-size: 24pt;");
Label lab5 = new Label("अनुच्छेद ᠪᠠᠢᠨᠠ"); // CORRECT
lab5.setStyle("-fx-font-size: 24pt;");
VBox vBox = new VBox(webView, lab1, lab2, lab3, lab4, lab5);
Scene scene = new Scene(vBox, 800, 600);
primaryStage.setTitle("JavaFX Mongolian Test");
primaryStage.setScene(scene);
primaryStage.show();
}
}
}
package com.vistamaresoft.fxtest;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.VBox;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
公共班机
{
静态最终字符串html=
“\n”+
“\n\n”+
“ᠪᠠᠢᠨᠠ “+//不正确!
“