AWT 上格式错误的波斯语字符

jlo*_*010 5 java fonts awt character internationalization

当我开始使用 JDK6 编程时,我对文本组件没有任何问题没有任何问题,无论是在 AWT 还是在 Swing 中。

\n\n

但对于AWT 组件的标签或标题的标签或标题,我确实遇到了问题。我无法在 AWT 组件上显示波斯语字符(在 Swing 中我将它们输入到源代码中)。

\n\n

这是我的示例代码:

\n\n
import javax.swing.*;\nimport java.awt.*;\nimport java.io.*;\nimport java.util.Properties;\n\npublic class EmptyFarsiCharsOnAWT extends JFrame{\n\npublic EmptyFarsiCharsOnAWT() {\n    super("\xd9\x85\xd8\xab\xd8\xa7\xd9\x84");\n    setDefaultCloseOperation(3);\n    setVisible(rootPaneCheckingEnabled);\n}\npublic static void main(String[] args) throws AWTException, IOException {\n    JFrame jFrame = new EmptyFarsiCharsOnAWT();\n    MenuItem show ;\n    // approach 1 = HardCoding :\n    /*\n    show = new MenuItem("\\u0646\\u0645\\u0627\\u06cc\\u0634");\n     *\n     */\n\n    // approach 2 = using simple utf-8 saved text file :\n    /*\n        BufferedReader in = new BufferedReader(new FileReader("farsiLabels.txt"));\n        String showLabel = in.readLine();\n        in.close();\n\n        show = new MenuItem(showLabel);\n     *\n     */\n\n     // approach 3 = using properties file :\n\n    FileReader in = new FileReader("farsiLabels.properties");\n    Properties farsiLabels = new Properties();\n    farsiLabels.load(in);\n    show = new MenuItem(farsiLabels.getProperty("tray.show"));\n    PopupMenu popUp = new PopupMenu();\n    popUp.add(show);\n\n        // creating Tray object\n        Image iconIamge = Toolkit.getDefaultToolkit().getImage("greenIcon.png");\n\n        TrayIcon trayIcon = new TrayIcon(iconIamge, null, popUp);\n        SystemTray tray = SystemTray.getSystemTray();\n        tray.add(trayIcon);\n\n        jFrame.setIconImage(iconIamge);\n    } \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这三种方法在使用 IDE 运行时都有效,但是当我制作包含此类的 JAR 时(通过 NetBeans > 项目 > 清理和构建),我看不到预期的字符(它显示空/空白方块) !

\n\n

注意: \n看来我无法附加任何内容,因此文本文件的内容将是这样的:\xd9\x86\xd9\x85\xd8\xa7\xdb\x8c\xd8\xb4属性文件的内容是:

\n\n
#Sun May 02 09:45:10 IRDT 2010   \ntray.show=\xd9\x86\xd9\x85\xd8\xa7\xdb\x8c\xd8\xb4\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想我必须让你知道我不久前在SDN上发布了这个问题和“Java Ranch”论坛以及其他本地论坛上发布了这个问题,但我仍在等待......

\n\n

顺便说一句,我正在使用最新版本的 Netbeans IDE...

\n\n

如果有人能解决这些该死的 AWT 组件从不为我渲染任何波斯语字符的问题,我将不胜感激......

\n

jlo*_*010 2

您的回复中最令人兴奋的部分是:“ $ java -jar dist/test6.jar ”!它真的显示了真实的角色(就像框架标题一样)吗?!而不是盒子或垃圾?如果我很难相信的话,我很抱歉,因为我用 Java 进行开发工作花了这么长时间没有任何答案,也没有搜索,也没有在论坛上提问,唯一的问题就是这个!

那么,我能做什么呢?我应该使用什么字体?不幸的是我对字体不太熟悉,直到现在我才在Java中使用全局字体(Serif,SansSerif等)并且只修改了它们的大小或样式,但是在你建议之后我通过这些代码检查了几种波斯语ttf字体:

        File fontFile = new File("F_JADID.TTF");
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
        show.setFont(font.deriveFont(15f));
Run Code Online (Sandbox Code Playgroud)

但结果只是盒子!(只是使用HardCoding)我想我应该提到我的环境是win xp,我不仅在我的机器上遇到这个问题,而且在另一个运行的xp操作系统上也有这个问题。我用的是jdk6u17。

我可以同意你对字体的怀疑,因为编码问题(根据我的经验)出现问号,但与渲染字符相关的垃圾或空框。但我仍然有问题,就像第一天一样:( 你使用什么字体,我遇到的另一个问题是:为什么 swing 在不指定字体的情况下没有任何问题,但 AWT.

附录:感谢本页中的Oscar Reyes提供此链接,并感谢 StackOverflow :) 他们救了我!从本节中我应该引用:

使用对等 AWT 组件的应用程序只能使用逻辑字体名称。

并从本节中引用:

对于使用 AWT 对等组件的应用程序,Sun 的 JRE 仅当在针对这些特定语言本地化的主机操作系统上运行时才选择中文、日文或韩文的字体

是的,你猜对了!通过将操作系统区域设置设置为波斯语,我得到了正确的结果。

但我仍然应该从该文章中研究并看看如何通过不设置正确的区域设置来获得正确的结果。

当我得到结果时,我会解释如何进行,但仍然会在这里听。祝我好运。