7

我一直在尝试将 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

4

4 回答 4

5

试试这个代码:

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

}

}
于 2009-10-08T06:46:59.470 回答
1

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

您能否提供更多有关您要做什么的代码?

于 2009-10-05T21:53:23.537 回答
0

正如您正确地假设问题最有可能出现在:

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

由于您使用 UTF-8 编码,因此字符可能被编码为超过 1 个字节,因此将您读取的每个字节添加为字符将不起作用。

为了使其工作,您可以尝试将所有字节写入 ByteBuffer 并使用 CharsetDecoder (Charset.forName("UTF-8).newDecoder(), "UTF-8" to match the PrintStream) 将它们转换为您添加的字符面板。

我还没有尝试过确保它有效,但我认为值得一试。

于 2009-10-07T02:26:31.783 回答
0

Java 中的字符串没有编码 - 字符串由字符数组支持,并且当它们被视为字符串和 char 值时,字符应始终为 utf-16。

仅当您将字符串/字符导出到外部表示(或位置)或从外部表示(或位置)导出或导入时,编码才会出现问题。传输必须使用一系列字节来表示字符串。

我认为第一个解决方案很接近,但也完全混乱。首先,您要求 java 将 char 值转换为其 cp1252 编码的等效值(cp1252“语言”中形状相似的字符的“单词”)。然后从这个字节序列创建一个字符串,说明这个 cp-1252 代码序列实际上是一个 utf-8 代码序列,应该从 utf-8 转换为标准内存表示 (utf-16)。

字符串永远不是 utf og cp1252 或类似的东西 - 它总是字符。只有字节序列是 utf-8 或 cp1252。如果您想将 char 值转换为可以使用的 utf-8 字符串。

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

实际上,我认为问题出在其他地方,可能在打印流内部以及它如何打印输入。您应该尽量避免将字符串和字符转换为字节或从字节转换,因为这始终是混淆和麻烦的主要来源。也许您必须重写所有方法才能在转换之前捕获字符数据。

于 2009-10-05T21:38:26.890 回答