2009-10-05 6 views
6

私はSystem.out PrintStreamをJTextPaneにリダイレクトしようとしています。特別なロケール文字のエンコーディングを除いて、これはうまくいきます。私はそれについて多くの文書を見つけました(例mindprod encoding page参照)が、私はまだそれと戦っています。同様の質問がStackOverFlowに掲載されましたが、私が見た限りエンコーディングは扱われていませんでした。すべてのコンソール出力を正しいエンコーディングでSwing JTextArea/JTextPaneにリダイレクトする方法はありますか?

まず解決策:

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

第2の解決策は、java.nioで使用する必要があります。私はCharsetの使い方を理解していません。

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 

どちらの解決策もありません。何か案が?事前に

おかげで、Javaで jgran

+0

:なぜ二人のユーザ - jgran(OP)とjgran(回答します。http://stackoverflow.com/questions/1522444/how-to-redirect-すべてのコンソール出力 - スイング - jtextarea-jtextpane-the-right/1530213#1530213) – akf

+0

私の間違いは... FAQをもっと真剣に考えなければなりません。だから同じユーザー! –

答えて

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

} 

} 
+0

自分の問題にすばやく適応できる、おかげであなたのソリューションには大変感謝しています。よろしく。 –

+0

'write()'は自動的に 'flush()'を呼び出しますか? – TheRealChx101

+0

@ chx101、write()はflush()を呼び出さず、新しい行ごとにPrintStreamを呼び出します。上記の例のflush()の実装では、1024のcharバッファが使用されています。これは、プロの使用には適していません。 –

0

文字列のエンコーディングを持っていない - 文字列は、文字列が付いていて、それらは文字列とchar型の値として扱われている間の文字は常にUTF-16でなければなりません。

エンコーディングは、文字列/文字を外部表現(または場所)にエクスポートまたはインポートするときにのみ問題になります。転送は、文字列を表すバイトシーケンスを使用して行わなければなりません。

私は最初の解決策は近いと思うが、完全に混乱している。最初に、javaにchar値をcp1252でエンコードされた同等の値(cp1252の 'language'の類似形の文字の 'word')に変換するように依頼します。次に、このバイトシーケンスから、このcp-1252コードのシーケンスが実際にはutf-8コードのシーケンスであり、utf-8から標準のメモリ内表現(utf-16)に変換されるべきであることを示す文字列を作成します。

文字列は決してutf og cp1252などのものではありません。それは文字です。バイト配列のみがutf-8またはcp1252です。 char値をutf-8文字列に変換する場合は、使用することができます。

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

は実は、私はこの問題は、おそらくのPrintStream内で、他の場所にあり、それはその入力を出力する方法を考えます。文字列と文字をバイトとの間で変換しないようにする必要があります。なぜなら、それは常に混乱とトラブルの主な原因であるからです。変換前に文字データを取得するには、すべてのメソッドをオーバーライドする必要があります。

0

あなたは当然の問題が最も可能性が高いと想定通り:あなたはUTF-8でエンコードするので、文字を超える1バイトでエンコードすることができるので、文字が勝ったとして、あなたが読んで各バイトを追加

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

仕事はありません。

すべてのバイトをByteBufferに書き込んで、CharsetDecoder(Charset.forName( "UTF-8).newDecoder()"、 "UTF-8"を使用してPrintStreamに一致させてみてください)

私はそれが動作することを確認しようとしていないが、それは試してみる価値があると思う。

関連する問題