2013-06-24 37 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。 –