Искаженные символы фарси на AWT - PullRequest
4 голосов
/ 29 мая 2010

Когда я начал программировать на 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> project> clean & build), я не вижу ожидаемых символов (он показывает ПУСТОЙ / ПУСТОЙ КВАДРАТ)!

Примечание: Кажется, я ничего не могу прикрепить, поэтому содержимое текстового файла будет таким: نمایش и содержимое файла свойств:

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

И я думаю, что должен сообщить вам, что я недавно опубликовал этот вопрос на SDN и форумах "Java Ranch" и других нативных форумах, и все же я жду ...

Кстати, я использую последнюю версию IDE Netbeans ...

Буду признателен, если у кого-нибудь есть решение этих чертовых компонентов AWT, никогда не отображающих для меня персонажа фарси ...

Ответы [ 2 ]

3 голосов
/ 29 мая 2010

Я подозреваю, что это связано с платформой. Ваш пример работает на моей платформе с использованием подхода 1 в Netbeans или в командной строке; Я не пробовал другие подходы.

Возможно, существует несоответствие между IDE и командной строкой в ​​отношении кодировки символов по умолчанию. Я заметил, что NetBeans, Eclipse и многие консоли могут быть настроены на что-то отличное от платформы по умолчанию. Вот код для проверки:

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

Вы также можете посмотреть на этот связанный вопрос .

Добавление: примечание show строка изменена для соответствия заголовку JFrame для сравнения. Заголовок и меню выглядят так же из Run > Run Project NetBeans, а также из следующих командных строк:

$ java -cp build/classes EmptyFarsiCharsOnAWT
$ java -jar dist/test6.jar

image

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);
    }
}
2 голосов
/ 30 мая 2010

Самая захватывающая часть вашего ответа была: " $ 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));

но просто коробки был результатом! (просто используя HardCoding) Я думаю, что я должен упомянуть, что мое окружение - win xp, и у меня есть эта проблема не только в моей машине, но и в другом запущенном xp os. И я использую jdk6u17.

Я могу быть согласен с вами в том, что вы подозреваете шрифты, потому что проблема кодирования (по моему опыту) появляется с вопросительным знаком, но с мусором или пустыми полями, связанными с отображением символов. Но все же у меня есть проблема, как в первый день :( Какой шрифт вы используете и другой вопрос, с которым я столкнулся: Почему у Swing нет проблем без указания шрифта, кроме AWT.

Приложение : Благодаря Оскару Рейесу на этой странице за предоставление этой ссылки и благодаря StackOverflow :) Они спасли меня! с этот раздел я должен цитировать:

Приложение, использующее одноранговые компоненты AWT, может использовать только логические имена шрифтов.

и с этот раздел должен указывать:

Для приложений, использующих одноранговые компоненты AWT, JRE Sun выбирают шрифты для китайского, японского или корейского только при работе в хост-операционных системах, локализованных для этих конкретных языков

Да, ты угадаешь правильно! установив для операционной системы язык фарси, я получил правильный результат.

но я все еще должен исследовать и посмотреть, как можно получить правильный результат, не указав правильную локаль из этой статьи.

Я объясню, как, когда я получил результат, но все равно буду слушать здесь. пожелай мне удачи.

...