我假设您的控制台仍在 cmd.exe 下运行。我怀疑你的控制台是否真的需要 UTF-8 - 我希望它确实是 OEM DOS 编码(例如850 或 437 http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx.)
Java 将使用以下方式对字节进行编码默认编码 http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#defaultCharset--在 JVM 初始化期间设置。
在我的电脑上重现:
java Foo
Java编码为windows-1252;控制台解码为 IBM850。结果:Mojibake
java -Dfile.encoding=UTF-8 Foo
Java编码为UTF-8;控制台解码为 IBM850。结果:Mojibake
cat test.txt
cat 将文件解码为 UTF-8; cat 编码为 IBM850;控制台解码为 IBM850。
java Foo | cat
Java编码为windows-1252; cat 解码为 windows-1252; cat 编码为 IBM850;控制台解码为 IBM850
java -Dfile.encoding=UTF-8 Foo | cat
Java编码为UTF-8; cat 解码为 UTF-8; cat 编码为 IBM850;控制台解码为 IBM850
此次实施cat必须使用启发式方法确定字符数据是否为 UTF-8,然后将数据从 UTF-8 或 ANSI(例如 windows-1252)转码为控制台编码(例如 IBM850)。
可以使用以下命令确认这一点:
$ java HexDump utf8.txt
78 78 c3 a4 c3 b1 78 78
$ cat utf8.txt
xxäñxx
$ java HexDump ansi.txt
78 78 e4 f1 78 78
$ cat ansi.txt
xxäñxx
The cat命令可以做出这个决定,因为e4 f1
不是有效的 UTF-8 序列。
您可以通过以下方式更正 Java 输出:
-
设置控制台编码 http://illegalargumentexception.blogspot.co.uk/2009/04/i18n-unicode-at-windows-command-prompt.html#charsets_1252到系统 ANSI 值
- 使用Console http://docs.oracle.com/javase/8/docs/api/java/io/Console.html type
- 使用一些湿婆层 http://illegalargumentexception.blogspot.co.uk/2013/06/go-unicode-on-windows-command-prompt.html#gou_java就像你正在做的那样cat
HexDump是一个简单的 Java 应用程序:
import java.io.*;
class HexDump {
public static void main(String[] args) throws IOException {
try (InputStream in = new FileInputStream(args[0])) {
int r;
while((r = in.read()) != -1) {
System.out.format("%02x ", 0xFF & r);
}
System.out.println();
}
}
}