Java如何确定System.out
使用的编码?
给定以下类:
import java.io.File;
import java.io.PrintWriter;
public class Foo
{
public static void main(String[] args) throws Exception
{
String s = "xxäñxx";
System.out.println(s);
PrintWriter out = new PrintWriter(new File("test.txt"), "UTF-8");
out.println(s);
out.close();
}
}
字符串
它保存为UTF-8,并在Windows系统上使用javac -encoding UTF-8 Foo.java
编译。
然后在git-bash控制台上(使用UTF-8字符集)我这样做:
$ java Foo
xxõ±xx
$ java -Dfile.encoding=UTF-8 Foo
xxäñxx
$ cat test.txt
xxäñxx
$ java Foo | cat
xxäñxx
$ java -Dfile.encoding=UTF-8 Foo | cat
xxäñxx
型
这是怎么回事
显然,java会检查它是否连接到终端,并在这种情况下更改其编码。有没有一种方法可以强制Java简单地输出纯UTF-8?
我也用cmd控制台做了同样的尝试。重定向STDOUT似乎没有任何区别。如果没有file.encoding参数,它将输出ansi编码,而参数则输出utf8编码。
1条答案
按热度按时间0s7z1bwu1#
我假设您的控制台仍然在cmd.exe下运行。我怀疑你的控制台真的期待UTF-8 -我希望它真的是OEM DOS编码(eidogg。850 or 437 .)
Java将在JVM初始化期间使用默认编码集对字节进行编码。
在我的PC上复制:
字符串
Java编码为Windows-1252;控制台解码为IBM 850。结果:Mojibake
型
Java编码为UTF-8;控制台解码为IBM 850。结果:Mojibake
型
cat将文件解码为UTF-8; cat编码IBM 850;控制台解码为IBM 850。
型
Java编码为Windows-1252; cat解码为windows-1252; cat编码IBM 850;控制台解码为IBM 850
型
Java编码为UTF-8; cat解码为UTF-8; cat编码IBM 850;控制台解码为IBM 850
这可以通过以下命令进行确认:
型
e4 f1
不是有效的UTF-8序列。您可以通过以下方式更正Java输出:
型