Интернационализированная строка в 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");

1 ответ

Решение

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

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

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

Например:

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);
            }
        });
    }
}
Другие вопросы по тегам