Java 中文字符串输出乱码
- 1、IDE和系统控制台编码格式
- 2、设置标准输出编码
1、IDE和系统控制台编码格式
Java 中文字符串输出乱码
问题是由于代码格式和输出控制台的编码格式不同造成的。
一般代码文件都是推荐使用UTF-8
格式(默认),此时在中文系统环境下,输出终端都是不匹配的。下面截图运行结果:代码编码UTF-8、IDE输出编码GBK、Win10系统终端编码x-mswin-936。
(IntelliJ IDEA中文不友好这个是设置IDE编码,当时没有深究)
String fileCharset = System.getProperty("file.encoding");
String outCharset = System.out.charset().name();
System.out.println("fileCharset=" + fileCharset + "; outCharset=" + outCharset);
System.out.println("System.out.charset() = " + System.out.charset());
System.out.println("native.encoding = " + System.getProperty("native.encoding"));
System.out.println("sun.jnu.encoding = " + System.getProperty("sun.jnu.encoding"));
System.out.println("sun.stdout.encoding = " + System.getProperty("sun.stdout.encoding"));
System.out.println("sun.io.unicode.encoding = " + System.getProperty("sun.io.unicode.encoding"));
System.out.println("你好 java");
IntelliJ IDE输出:
win10 终端:
2、设置标准输出编码
- 上面看出:获取代码文件编码
System.getProperty("file.encoding")
、获取IDE输出编码获取System.out.charset().name()
、系统终端编码System.getProperty("sun.stdout.encoding")
System.out.charset().name()
实质获取System.getProperty("sun.stdout.encoding")
,属性"sun.stdout.encoding"
为空时,编码默认为native.encoding
Console.charset()
上面注释sun.stdout/err.encoding
等效于Console.charset()
,但是API 17
生效。
public class Test {
public static void main(String[] args) {
String fileCharset = System.getProperty("file.encoding");
String outCharset = System.out.charset().name();
System.out.println("fileCharset=" + fileCharset + "; outCharset=" + outCharset);
System.out.println("System.out.charset() = " + System.out.charset());
System.out.println("native.encoding = " + System.getProperty("native.encoding"));
System.out.println("sun.jnu.encoding = " + System.getProperty("sun.jnu.encoding"));
System.out.println("sun.stdout.encoding = " + System.getProperty("sun.stdout.encoding"));
System.out.println("sun.io.unicode.encoding = " + System.getProperty("sun.io.unicode.encoding"));
System.out.println("你好 java");
if (System.console() != null) {
System.out.println("System.console().charset() = " + System.console().charset().name());
}
System.out.println("#########################");
String stdoutEncoding = System.getProperty("sun.stdout.encoding");
stdoutEncoding = stdoutEncoding == null ? System.getProperty("file.encoding") : stdoutEncoding;
System.out.println("stdoutEncoding = " + stdoutEncoding);
if (!System.out.charset().name().equals(stdoutEncoding)) {
try {
PrintStream ps = new PrintStream(System.out, true, stdoutEncoding);
System.setOut(ps);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
System.out.println("System.out.charset() = " + System.out.charset());
System.out.println("native.encoding = " + System.getProperty("native.encoding"));
System.out.println("sun.jnu.encoding = " + System.getProperty("sun.jnu.encoding"));
System.out.println("sun.stdout.encoding = " + System.getProperty("sun.stdout.encoding"));
System.out.println("sun.io.unicode.encoding = " + System.getProperty("sun.io.unicode.encoding"));
System.out.println("#########################");
System.out.println("你好 java");
}
}
IntelliJ IDE输出:
win10 终端: