Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中System.out的编码问题_Java_Character Encoding_Printstream - Fatal编程技术网

Java中System.out的编码问题

Java中System.out的编码问题,java,character-encoding,printstream,Java,Character Encoding,Printstream,我在使用嵌入JTextArea的记录器时遇到困难:当我调用logger.append()方法时,它工作正常,但当我使用System.out.println()时,我所有的法语口音都消失了 在这里,您可以创建记录器,并将System.out和System.err重定向到记录器 this.logger = new TextAreaOutputStream(jta, jsp.getVerticalScrollBar()); System.setProperty("user.langage", "fr"

我在使用嵌入
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
的编码改为随机编码,它改变了打印错误的重音符号的外观,但我始终无法正确使用。我还尝试用unicode条目更改重音,例如
\u00e9
中的
é
,但它没有改变任何东西

在这里,我非常渴望得到你的帮助


Romain

您的
OutputStream
实现是错误的:您假装
write(int)
接收字符,但实际上它接收原始字节。如果您签出
PrintStream
,您将看到它的
print
append
方法首先应用编码,然后最终为每个编码字节调用
write(int)


您不应尝试将原始字节传输回
文本区域中的字符串。而是实现
PrintStream
及其基于字符的方法,并将这些字符串/字符数组直接放入UI组件中。

您确定“user.langage”吗?它不是“user.language”(注意“u”)吗?您应该检查您在开发工具中使用的编码。如果您使用Eclipse,请在项目->属性->资源上单击鼠标左键(并检查您是否使用UTF-8编码)@fge这显然是错误的,但同样,这可能与问题无关。maqjav>我检查了您提到的位置,但
UTF-8
已经是我默认的继承编码。编码错误必须来自另一个问题@fge和@Marko>你们都是对的。这是错误的,但与错误无关。不管怎么说,已经更正了,所以谢谢;-)我不太明白你的建议。我的TextAreaOutputStream实现的灵感来自于我在web上找到的许多此类实现示例(包括SO)。这些都是扩展
输出流的
TextArea
。另外,
PrintOutput
print
方法都是使用
String.valueOf()
方法的单行程序,与我的方法相同。我只能说,这些示例都是难看的黑客,而您正是暴露它们的人:它们只适用于ASCII或其他单字节编码。