7

System.outPrintStreamをJTextPaneにリダイレクトしようとしています。これは、特別なロケール文字のエンコードを除いて、正常に機能します。私はそれに関する多くのドキュメントを見つけました(例えば、mindprodエンコーディングページを参照してください)が、私はまだそれと戦っています。同様の質問がStackOverFlowに投稿されましたが、私が見た限りでは、エンコーディングは対処されていませんでした。

最初の解決策:

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

2番目のソリューションは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

javaの文字列にはエンコーディングがありません-文字列は文字配列に支えられており、文字列および文字値として扱われる間、文字は常にutf-16である必要があります。

エンコーディングは、文字列/文字を外部表現(または場所)との間でエクスポートまたはインポートする場合にのみ問題になります。転送は、文字列を表す一連のバイトを使用して実行する必要があります。

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

文字列は、cp1252などで使用されることはありません。常に文字です。バイトシーケンスのみがutf-8またはcp1252です。char値をutf-8文字列に変換する場合は、使用できます。

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

実際、問題は他の場所、おそらくプリントストリーム内とその入力の印刷方法にあると思います。文字列や文字をバイトに変換したり、バイトから変換したりすることは常に避けてください。これは常に混乱と問題の主な原因となるためです。おそらく、変換前に文字データをキャプチャするには、すべてのメソッドをオーバーライドする必要があります。

于 2009-10-05T21:38:26.890 に答える
0

あなたが正しく想定しているように、問題は次の場合に発生する可能性が最も高いです。

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

UTF-8でエンコードするため、文字は1バイトを超えてエンコードされる可能性があり、したがって、読み取った各バイトを文字として追加しても機能しません。

これを機能させるには、すべてのバイトをByteBufferに書き込み、CharsetDecoder(Charset.forName( "UTF-8).newDecoder()、" UTF-8 "を使用してPrintStreamと一致させる)を使用して、追加する文字に変換してみてください。パネル。

私はそれが機能することを確認するためにそれを試していませんが、それは試す価値があると思います。

于 2009-10-07T02:26:31.783 に答える