【问题标题】:Malformed Farsi characters on AWTAWT 上的格式错误的波斯语字符
【发布时间】:2011-02-25 09:39:43
【问题描述】:

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

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

这是我的示例代码:

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Properties;

public class EmptyFarsiCharsOnAWT extends JFrame{

public EmptyFarsiCharsOnAWT() {
    super("مثال");
    setDefaultCloseOperation(3);
    setVisible(rootPaneCheckingEnabled);
}
public static void main(String[] args) throws AWTException, IOException {
    JFrame jFrame = new EmptyFarsiCharsOnAWT();
    MenuItem show ;
    // approach 1 = HardCoding :
    /*
    show = new MenuItem("\u0646\u0645\u0627\u06cc\u0634");
     *
     */

    // approach 2 = using simple utf-8 saved text file :
    /*
        BufferedReader in = new BufferedReader(new FileReader("farsiLabels.txt"));
        String showLabel = in.readLine();
        in.close();

        show = new MenuItem(showLabel);
     *
     */

     // approach 3 = using properties file :

    FileReader in = new FileReader("farsiLabels.properties");
    Properties farsiLabels = new Properties();
    farsiLabels.load(in);
    show = new MenuItem(farsiLabels.getProperty("tray.show"));
    PopupMenu popUp = new PopupMenu();
    popUp.add(show);

        // creating Tray object
        Image iconIamge = Toolkit.getDefaultToolkit().getImage("greenIcon.png");

        TrayIcon trayIcon = new TrayIcon(iconIamge, null, popUp);
        SystemTray tray = SystemTray.getSystemTray();
        tray.add(trayIcon);

        jFrame.setIconImage(iconIamge);
    } 
}

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

注意: 看来我不能附加任何东西,所以文本文件的内容是这样的:نمایش 和属性文件的内容:

#Sun May 02 09:45:10 IRDT 2010   
tray.show=نمایش

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

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

如果有人能解决这些该死的 AWT 组件永远不会为我呈现任何波斯语字符的解决方案,我将不胜感激......

【问题讨论】:

  • 亲爱的垃圾神,我绝对喜欢触发那面旗帜,但似乎因为我是这里的 tyro,我不能,但保证只要我有足够的声望就这样做(我对这个网站不太熟悉...) 谢谢
  • 有趣。我不能投票给你的答案;不知何故,系统认为它是我的,可能是由于称呼。
  • 是的,就是这样。我对你的问题和答案投了赞成票。

标签: java fonts internationalization awt character


【解决方案1】:

我怀疑这与平台有关。您的示例似乎可以在 Netbeans 或命令行中使用方法 1 在我的平台上运行;我没有尝试其他方法。

在默认字符编码方面,IDE 和命令行之间可能存在差异。我注意到 NetBeans、Eclipse 和许多控制台可以设置为平台默认值以外的其他值。这是要检查的代码:

System.out.println(System.getProperty("file.encoding"));
System.out.println(Charset.defaultCharset().name());

你也可以看看这个相关的question

附录:注意 show 字符串已更改为匹配 JFrame 标题以进行比较。标题和菜单在 NetBeans 的Run > Run Project 以及通过这些命令行看起来是一样的:

$ java -cp 构建/类 EmptyFarsiCharsOnAWT $ java -jar dist/test6.jar

import javax.swing.*;
import java.awt.*;
import java.io.*;

public class EmptyFarsiCharsOnAWT extends JFrame{

public EmptyFarsiCharsOnAWT() {
    super("مثال");
    setDefaultCloseOperation(3);
    setVisible(rootPaneCheckingEnabled);
}
public static void main(String[] args) throws AWTException, IOException {
    JFrame jFrame = new EmptyFarsiCharsOnAWT();
    MenuItem show ;
    // approach 1 = HardCoding :
    show = new MenuItem("\u0645\u062b\u0627\u0644");
    PopupMenu popUp = new PopupMenu();
    popUp.add(show);
        // creating Tray object
        Image iconIamge = Toolkit.getDefaultToolkit().getImage("image.jpg");
        TrayIcon trayIcon = new TrayIcon(iconIamge, null, popUp);
        SystemTray tray = SystemTray.getSystemTray();
        tray.add(trayIcon);
        jFrame.setIconImage(iconIamge);
    }
}

【讨论】:

  • 当 JAR 文件是由此类生成时,您是否注意到我正在谈论 IDE?或者你只是从IDE(或命令行)检查方法1,因为问题是在打包存档之后(正如我在我的问题中提到的,在代码之后)如果你从JAR得到正确的结果,我会感到惊讶!两个编码检查的结果也是 "utf-8" THX
  • 如果不是编码可能是字体;在 Mac OS X 和 Ubuntu 上看起来不错。
  • @jlover2010:我希望你不要让我在波斯语中发布一些顽皮的东西。 :-)
  • 不,绝对不是。您可以在下面的在线词典页面中查看该单词:aryanpour.com 感谢您附上图片,好吧,如果代码正好在图片下方,我很高兴世界上至少有一个人得到了正确的结果!
  • 我的意思是开玩笑,用:-) 表示,但我很欣赏字典参考。抱歉我不懂XP;也许 NetBeans 有正确的字体。代码是一样的;图片是en.wikipedia.org/wiki/File:Mona_Lisa.jpg
【解决方案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));

但结果只是盒子! (仅使用硬编码) 我想我应该提到我的环境是win xp,我不仅在我的机器上遇到了这个问题,而且在另一个正在运行的xp os中也有这个问题。我正在使用 jdk6u17。

我同意你怀疑字体的观点,因为编码问题(根据我的经验)出现时带有问号,但与渲染字符相关的垃圾或空框。 但是我仍然有问题,就像第一天一样:( 您使用的字体和我遇到的另一个问题是: 为什么swing不指定字体就没有问题,而是AWT。

附录:感谢 Oscar Reyes in this page 提供 this link 并感谢 StackOverflow :) 他们救了我!来自this section 我应该引用:

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

来自this section 应该引用:

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

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

但我仍然应该研究,看看如何通过不设置正确的语言环境来获得正确的结果,来自那篇文章。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多