如何重定向所有控制台输出到一个Swing的JTextArea / JTextPane中与正确的编码?

2019-07-21 00:32发布

我一直到System.out的PrintStream重定向到的JTextPane。 这工作得很好,除了特殊的语言环境字符的编码。 我发现了很多关于它的文件(见例的mindprod编码页 ),但我仍然与它战斗。 类似的问题被张贴在StackOverflow的,但是编码不就我见过的解决。

第一个解决方案:

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

第二个解决方案应当使用java.nio中。 我不知道如何使用的字符集。

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

Answer 1:

试试这个代码:

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

}

}


Answer 2:

字符串中的java不具有编码 - 串由一个字符数组支持和字符应始终是UTF-16,同时它们作为字符串和char值处理。

当您导出或导入字符串/字符或从外部表现(或位置)的编码只成为一个问题。 传输必须使用一个字节序列来表示字符串发生。

我认为第一个解决方案是接近,但也完全糊涂了。 首先,你问的Java翻译的char值到他们的CP1252编码的等效值(“word'for在CP1252相若方式的形字母‘语言’)。 然后,创建从该字节序列的字符串,指出的CP-1252的代码,这种序列是实际上的UTF-8编码的序列,并应被转换为从UTF-8的标准内存中表示(UTF-16)。

字符串是永远UTF OG CP1252或类似的东西 - 这是alsways字符。 仅字节序列是UTF-8或CP1252。 如果你想char值转换成您可以使用UTF-8字符串。

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

其实,我觉得问题出在其它地方,可能是里面的PrintStream以及如何打印其输入。 你应该尽量避免从字节字符串转换和字符为/,因为这始终是混乱和麻烦的主要来源。 也许你必须覆盖,以转换前捕获字符数据的所有方法。



Answer 3:

正如你理所当然地认为问题很可能出在:

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

因为您使用UTF-8编码,字符可以与多于1个字节,从而将每个读你作为一个字符将不起作用字节进行编码。

为了使它工作,你可以尝试写的所有字节到字节缓冲区并使用CharsetDecoder(Charset.forName(“UTF-8).newDecoder(),‘UTF-8’以匹配的PrintStream),将它们转换成你添加字符面板。

我还没有尝试过,以确保它的工作原理,但我认为这是值得一试。



Answer 4:

您应该创建正确的编码中的PrintStream: http://www.j2ee.me/j2se/1.5.0/docs/api/java/io/PrintStream.html#PrintStream(java.io.File ,java.lang中。串)

能否请您提供关于什么是你想要做更多的代码?



文章来源: How to redirect all console output to a Swing JTextArea/JTextPane with the right encoding?