Как перенаправить весь вывод консоли на Swing JTextArea / JTextPane с правильной кодировкой?

Я пытался перенаправить систему.из PrintStream в JTextPane. Это отлично работает, за исключением кодирования специальных символов локали. Я нашел много документации об этом (см. например. страница кодирования mindprod), но я все еще борюсь с ним. Аналогичные вопросы были опубликованы в StackOverFlow, но кодировка не была рассмотрена, насколько я видел.

первый вариант:

String sUtf = new String(s.getBytes("cp1252"),"UTF-8");

второе решение должно использовать java.НИО. Я не понимаю как использовать кодировку.

Charset defaultCharset = Charset.defaultCharset() ;
byte[] b = s.getBytes();
Charset cs = Charset.forName("UTF-8");
ByteBuffer bb = ByteBuffer.wrap( b );
CharBuffer cb = cs.decode( bb );
String stringUtf = cb.toString();
myTextPane.text = stringUtf

ни одно решение не работает. Есть идеи?

спасибо заранее, к сайту jgran

4 ответов


попробуйте этот код:

public class MyOutputStream extends OutputStream {

private PipedOutputStream out = new PipedOutputStream();
private Reader reader;

public MyOutputStream() throws IOException {
    PipedInputStream in = new PipedInputStream(out);
    reader = new InputStreamReader(in, "UTF-8");
}

public void write(int i) throws IOException {
    out.write(i);
}

public void write(byte[] bytes, int i, int i1) throws IOException {
    out.write(bytes, i, i1);
}

public void flush() throws IOException {
    if (reader.ready()) {
        char[] chars = new char[1024];
        int n = reader.read(chars);

        // this is your text
        String txt = new String(chars, 0, n);

        // write to System.err in this example
        System.err.print(txt);
    }
}

public static void main(String[] args) throws IOException {

    PrintStream out = new PrintStream(new MyOutputStream(), true, "UTF-8");

    System.setOut(out);

    System.out.println("café résumé voilà");

}

}

String в java не имеет кодировки-строки поддерживаются массивом символов, и символ всегда должен быть utf-16, пока они рассматриваются как строки и значения char.

кодировка возникает только при экспорте или импорте строк / символов во внешнее представление (или местоположение) или из него. Передача должна происходить с использованием последовательности байтов для представления строки.

Я думаю, что первое решение близко, но и совершенно запутались. Сначала вы просите java перевести значения char в их эквивалентные значения с кодировкой cp1252 ("слово" для аналогичного символа в языке cp1252). Затем вы создаете строку из этой последовательности байтов, заявляя, что эта последовательность кодов cp-1252 на самом деле является последовательностью кодов utf-8 и должна быть переведена на стандартное представление в памяти (utf-16) из utf-8.

строка никогда не является utf OG cp1252 или чем - то подобным-это символы alsways. Только байт последовательности utf-8 или cp1252. Если вы хотите перевести значения char в строку utf-8, вы можете использовать.

byte[] utfs = myString.getBytes("UTF-8");

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


Как вы справедливо предполагаете, проблема, скорее всего, в:

String s = Character.toString((char)i);

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

чтобы заставить его работать, вы можете попробовать записать все байты в ByteBuffer и использовать CharsetDecoder (Charset.forName ("UTF-8).newDecoder ()," UTF-8", чтобы соответствовать PrintStream), чтобы преобразовать их в символы, которые вы добавляете панель.

Я не попробовал, чтобы убедиться, что он работает, но я думаю, что стоит попробовать.


вы должны создать PrintStream с правильным кодированием: http://www.j2ee.me/j2se/1.5.0/docs/api/java/io/PrintStream.html#PrintStream(java.io.File, java.ленг.String)

не могли бы вы предоставить больше кода о том, что ты пытаешься сделать?