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

Можно создать большой JAR, который содержит все связанные классы. Следующий отрывок муравья показывает идею:

<target name="jar">
    <mkdir dir="build/jar"/>
    <unjar src="lib/jython.jar" dest="${classes.dir}" />
    <unjar src="lib/FOO.jar" dest="${classes.dir}" />
    <unjar src="lib/BAR.jar" dest="${classes.dir}" />
    <unjar src="lib/BAZ.jar" dest="${classes.dir}" />

    <jar destfile="build/jar/bigjython.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
        </manifest>
    </jar>
</target>
6
задан 5 October 2009 в 21:17
поделиться

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à");

}

}
5
ответ дан 17 December 2019 в 04:48
поделиться

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

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

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

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

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

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

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

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

0
ответ дан 17 December 2019 в 04:48
поделиться

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

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

0
ответ дан 17 December 2019 в 04:48
поделиться

Как вы правильно предполагаете, проблема, скорее всего, в: чтобы соответствовать PrintStream), чтобы преобразовать их в символы, которые вы добавляете в панель.

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

чтобы соответствовать PrintStream), чтобы преобразовать их в символы, которые вы добавляете в панель.

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

0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: