我一直到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
试试这个代码:
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à");
}
}
字符串中的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以及如何打印其输入。 你应该尽量避免从字节字符串转换和字符为/,因为这始终是混乱和麻烦的主要来源。 也许你必须覆盖,以转换前捕获字符数据的所有方法。
正如你理所当然地认为问题很可能出在:
String s = Character.toString((char)i);
因为您使用UTF-8编码,字符可以与多于1个字节,从而将每个读你作为一个字符将不起作用字节进行编码。
为了使它工作,你可以尝试写的所有字节到字节缓冲区并使用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.lang中。串)
能否请您提供关于什么是你想要做更多的代码?
文章来源: How to redirect all console output to a Swing JTextArea/JTextPane with the right encoding?