Интернационализированная строка в JTextArea

Как я могу отобразить любые неанглийские символы в JTextArea? Я пробовал разные способы, но ни один не работает. Следующий код выводит тарабарщину для любого неанглийского символа, например японского. В режиме отладки переменная msgUtf8Str действительно правильно показывает локальные символы. Набор вспомогательных символов может быть большим, например: японский, китайский (мандаринский диалект), французский, немецкий и т. д.

String msgUtf8Str = null;
byte[] msgUtf8= message.getBytes(Charset.forName("UTF-8"));
try
{
    msgUtf8Str = new String(msgUtf8, "UTF-8");
}
catch(Exception ex){}       
txtMsg.append(msgUtf8Str + "\n");

person naspras    schedule 22.12.2014    source источник
comment
Где вы получаете свою строку для отображения? Вы читаете это из файла? На каком компе ты это делаешь? Может ли он отображать неанглийские символы в других программах?   -  person Wim Deblauwe    schedule 22.12.2014
comment
Извините за задержку с ответом. Я могу записать неанглийскую строку в файл. Это кодировка UTF-8.   -  person naspras    schedule 23.12.2014


Ответы (1)


Удалите весь этот код, кроме последней строки.

Вы используете кодировку UTF-8 для перевода message в байты, которые вы затем переводите обратно в строку, используя ту же кодировку. Другими словами, вы совершили бессмысленное преобразование туда и обратно.

Исходная строка message уже подходит для отображения неанглийских символов. Вам не нужно использовать наборы символов в любом случае.

Например:

String message = "\u65e5\u672c\u8a9e \u4e2d\u6587 Fran\u00e7ais f\u00fcr";
textMsg.append(message).append("\n");

Вот небольшая демонстрация:

import java.awt.EventQueue;
import javax.swing.JOptionPane;

public class I18NDemo {
    public static void main(String[] args) {
        final String message =
            "\u65e5\u672c\u8a9e \u4e2d\u6587 Fran\u00e7ais f\u00fcr";

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(null, message);
                System.exit(0);
            }
        });
    }
}
person VGR    schedule 22.12.2014
comment
сообщение уже не на английском, когда я его читаю. Так что вы правы - мне, вероятно, не нужно использовать Charset. Однако это тоже не юникод. Существует локализованный файл свойств, который содержит, например, значения для японского языка. Я пытаюсь показать значения в JTextArea. Таким образом, прочитайте текст на японском языке из файла и покажите его в JTextArea. Не могли бы вы рассказать, как? - person naspras; 23.12.2014
comment
Что происходит, когда вы пытаетесь отобразить сообщение? Вы получаете исключение? Вы видите странные символы в JTextArea, такие как ▯ или � или ?? - person VGR; 23.12.2014
comment
Я вижу странных персонажей, как вы упомянули. - person naspras; 26.12.2014
comment
Вы изменили шрифт JTextArea? Что вы увидите, если установите для шрифта JTextArea значение new Font(Font.DIALOG, Font.PLAIN, 12)? - person VGR; 26.12.2014