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或其他单字节编码。