0

に埋め込んだロガーに問題があります。メソッドJTextAreaを呼び出すと問題なく動作しますが、 を使用すると、フランス語のアクセントがすべて失われます。logger.append()System.out.println()

ここでは、ロガーの作成と、ロガーへのリダイレクトがSystem.outありSystem.errます。

this.logger = new TextAreaOutputStream(jta, jsp.getVerticalScrollBar());
System.setProperty("user.langage", "fr");
PrintStream ps;
ps = new PrintStream(this.logger, true, "UTF-8");
System.setOut(ps);
System.setErr(ps);

ここにTextAreaOutputStreamクラスがあります。

import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JScrollBar;
import javax.swing.JTextArea;

public class TextAreaOutputStream extends OutputStream {
    private JTextArea jta;
    private JScrollBar jsb;

    public TextAreaOutputStream(JTextArea jta, JScrollBar jsb) {
        this.jta = jta;
        this.jsb = jsb;
    }

    public synchronized void append(String s) {
        this.jta.append(s);
        scroll();
    }

    public synchronized void write(int b) throws IOException {
        jta.append(String.valueOf((char) b));
        if (((char) b) == '\n')
            scroll();
    }

    private synchronized void scroll() {
        if ((jsb.getValue() + jsb.getVisibleAmount()) == jsb.getMaximum()) 
            jta.setCaretPosition(jta.getDocument().getLength());
    }
}

のエンコーディングをランダムエンコーディングに変更しようとしましたPrintStreamが、間違って印刷されたアクセントの外観が変わりましたが、正しくすることはできませんでした. \u00e9また、 forなどの Unicode エントリでアクセントを変更しようとしましたéが、何も変わりませんでした。

ここで、私はあなたの助けを求めるのに十分必死です.

ロマン

4

1 に答える 1

1

の実装OutputStreamが間違っていwrite(int)ます。文字を受け取るふりをしますが、実際には生のバイトを受け取ります。をチェックアウトすると、そのおよびメソッドが最初にエンコードを適用し、次にエンコードされた各バイトを最終的に呼び出すPrintStreamことがわかります。printappendwrite(int)

生のバイトを の文字列に戻そうとしないでくださいTextArea。代わりにPrintStream、その文字ベースのメソッドを実装し、それらの文字列/文字配列を UI コンポーネントに直接押し込みます。

于 2013-06-24T10:15:28.260 に答える