2013-06-24 73 views
0

我在記錄器中遇到了困難,我將其嵌入到JTextArea中:當我調用logger.append()方法時,它工作正常,但當我使用System.out.println()時,我所有的法語口音都丟失。使用Java中的System.out編碼問題

在這裏,您創建了記錄器並將System.outSystem.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的編碼改爲隨機編碼,它改變了印錯口音的樣子,但我從來沒有擁有它的權利。我還嘗試使用unicode條目(如\u00e9)更改重音符號é,但它沒有改變任何內容。

在這裏,我已經夠拼命找你幫忙,

羅曼

+1

你確定「user.langage」嗎?是不是「user.language」(注意'u')? – fge

+1

你應該檢查你的開發工具中使用了哪些編碼。如果你使用Eclipse,在項目 - >屬性 - >資源上單擊左邊(並檢查你是否使用UTF-8編碼) – maqjav

+0

@fge這顯然是錯誤的,但是再次,它可能與這個問題無關。 –

回答

1

你實現OutputStream是錯誤的:你假裝write(int)接收字符,但實際上它接收原始字節。如果您檢查出PrintStream,您會看到其printappend方法首先應用編碼,然後最終針對每個編碼字節調用write(int)

您應該不要嘗試將原始字節傳送回TextArea中的字符串。而是實現PrintStream及其基於字符的方法,並將這些字符串/字符數組直接移到UI組件中。

+0

我不知道你的意見。我的TextAreaOutputStream實現受到我在Web上發現的這種類的許多實現示例(包括SO)的啓發。這些都是擴展'OutputStream'的'TextArea'。同樣,使用'String.valueOf()'方法的'PrintOutput'的print方法都是單行方式。 – Maveric78f

+0

我只能說這些例子是醜陋的黑客,你是這樣暴露他們的人:他們只能用於ASCII或其他單字節的encondings。 –