2009-10-05 4 views
6

Ich habe versucht, System.out PrintStream zu einem JTextPane umzuleiten. Dies funktioniert gut, außer für die Codierung von speziellen Gebietsschemata. Ich habe eine Menge Dokumentation darüber gefunden (siehe zB mindprod encoding page), aber ich kämpfe immer noch damit. Ähnliche Fragen wurden in StackOverFlow gepostet, aber die Codierung wurde nicht so weit angesprochen, wie ich gesehen habe.Wie umleiten Sie alle Konsolenausgaben an eine Swing JTextArea/JTextPane mit der richtigen Kodierung?

Erste Lösung:

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

Zweite Lösung verwenden java.nio sollte. Ich verstehe nicht, wie man den Zeichensatz benutzt.

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 

Keine der Lösungen funktioniert. Irgendeine Idee?

Vielen Dank im Voraus, jgran

+0

off topic Frage: warum die beiden Benutzer - jgran (OP) und jgran (Antworter: http: //stackoverflow.com/questions/1522444/how-to-redirect- all-console-output-to-a-swing-jtextarea-jTextpane-mit-der-rechten/1530213 # 1530213)? – akf

+0

Mein Fehler ... sollte die FAQ ernster haben. Also der gleiche Benutzer! –

Antwort

5

Versuchen Sie diesen Code:

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

} 

} 
+0

Vielen Dank für Ihre Lösung, die schnell an mein Problem angepasst werden konnte. Grüße. –

+0

Ruft 'write()' automatisch 'flush()' auf? – TheRealChx101

+0

@ chx101, write() ruft flush() nicht auf, PrintStream jedoch für jede neue Zeile. Bitte beachten Sie, dass die Implementierung von flush() im obigen Beispiel einen char-Puffer von 1024 verwendet - was nicht für die Prod-Verwendung geeignet ist. –

0

String in Java nicht über eine Codierung - Strings von einem Zeichen-Array unterstützt werden, und Zeichen sollten immer utf-16 sein, während sie als Strings und char-Werte behandelt werden.

Die Codierung kommt nur in Frage, wenn Sie Zeichenketten/Zeichen zu oder von einer externen Darstellung (oder einem externen Ort) exportieren oder importieren. Die Übertragung muss mit einer Sequenz von Bytes erfolgen, um die Zeichenfolge darzustellen.

Ich denke, die erste Lösung ist in der Nähe, aber auch völlig verwirrt. Zuerst werden Sie Java bitten, die char-Werte in ihre cp1252-kodierten äquivalenten Werte zu übersetzen (das "Wort" für das ähnlich geformte Zeichen in der cp1252-Sprache). Dann erstellen Sie eine Zeichenfolge aus dieser Byte-Sequenz und geben an, dass diese Sequenz von cp-1252-Codes tatsächlich eine Sequenz von utf-8-Codes ist und in die standardmäßige In-Memory-Repräsentation (utf-16) von utf-8 übersetzt werden sollte.

Ein String ist nie utf og cp1252 oder etwas ähnliches - es ist immer Zeichen. Nur Bytefolgen sind utf-8 oder cp1252. Wenn Sie char-Werte in eine utf-8-Zeichenfolge umwandeln möchten, die Sie verwenden könnten.

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

Eigentlich denke ich, das Problem liegt woanders, wahrscheinlich im Printstream und wie es seinen Input druckt. Sie sollten versuchen, Zeichenfolgen und Zeichen zu/von Byte zu konvertieren, da dies immer eine Hauptquelle für Verwirrung und Ärger ist. Vielleicht müssen Sie alle Methoden überschreiben, um Zeichendaten vor der Konvertierung zu erfassen.

0

Wie Sie zu Recht das Problem übernehmen ist höchstwahrscheinlich in:

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

, da Sie mit UTF-8, Zeichen codieren, können mit mehr als 1 Byte codiert werden und somit jedes Byte Hinzufügen Sie als Zeichen gelesen hat arbeite nicht.

Um dies zu erreichen, können Sie versuchen, alle Bytes in einen ByteBuffer zu schreiben und einen CharsetDecoder (Charset.forName ("UTF-8) .newDecoder()," UTF-8 "für den PrintStream zu verwenden) Zeichen, denen Sie das Panel hinzufügen

Ich habe es nicht versucht, um sicherzustellen, dass es funktioniert, aber ich denke, es ist einen Versuch wert.