于 21 年 9 月 8 日更新,注意此解决方案不适用于 NetBeans 12.x 版本。参见Maven 项目的 NetBeans 12 UTF-8 中文输出
对于使用 Java 8 在 NetBeans 9.0 中创建的 Maven 应用程序,需要三个操作才能使中文字符在“输出”窗口中正确呈现,前两个您已经在执行:
- 添加到文件etc/netbeans.conf
-J-Dfile.encoding=UTF-8
中的属性,然后重新启动 NetBeans。netbeans_default_options
- 从Projects面板设置{project} > Properties > Sources > Encoding to UTF-8。
- 在应用程序调用
System.setOut(new PrintStream(System.out, true, "UTF8"));
时使调用时使用的打印流System.out.println()
支持 UTF-8 编码。
还值得注意的是一些不必要的更改:
- 无需在“输出”窗口(工具 > 选项 > 杂项 > 输出 > 字体)中选择特定字体,因为Monospaced的默认字体可以正常工作。如果不支持中文字符(例如Arial),选择其他字体实际上可能会导致问题。
- 无需
file.encoding=UTF-8
在{project} > Properties > Run > VM Options中指定。
- 无需在pom.xml中指定有关项目编码的任何内容。
这是代码:
package com.unthreading.mavenchinesechars;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
public class ChineseChars {
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println("System.getProperty(\"file.encoding\"): " + System.getProperty("file.encoding"));
System.out.println("Charset.defaultCharset(): " + Charset.defaultCharset());
System.out.println("System.getProperty(\"java.version\"): " + System.getProperty("java.version"));
String text = "你好!";
System.out.println(text); // <<<======================= Fails!
System.setOut(new PrintStream(System.out, true, "UTF8")); // Essential!
System.out.println(text); // <<<======================= Works!
}
}
这是pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.unthreading</groupId>
<artifactId>MavenChineseChars</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
这是NetBeans中的输出:
cd D:\NB82\MavenChineseChars; JAVA_HOME=C:\\Java\\jdk1.8.0_181 M2_HOME=C:\\apache-maven-3.6.0 cmd /c "\"\"C:\\apache-maven-3.6.0\\bin\\mvn.cmd\" -Dexec.args=\"-classpath %classpath com.unthreading.mavenchinesechars.ChineseChars\" -Dexec.executable=C:\\Java\\jdk1.8.0_181\\bin\\java.exe -Dmaven.ext.class.path=C:\\NetBeans9\\java\\maven-nblib\\netbeans-eventspy.jar org.codehaus.mojo:exec-maven-plugin:1.5.0:exec\""
Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts.
Scanning for projects...
-----------------< com.unthreading:MavenChineseChars >------------------
Building MavenChineseChars 1.0-SNAPSHOT
--------------------------------[ jar ]---------------------------------
--- exec-maven-plugin:1.5.0:exec (default-cli) @ MavenChineseChars ---
System.getProperty("file.encoding"): Cp1252
Charset.defaultCharset(): windows-1252
System.getProperty("java.version"): 1.8.0_181
???
你好!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 1.021 s
Finished at: 2018-12-12T18:24:12-05:00
------------------------------------------------------------------------
从输出中,请注意:
System.setOut(new PrintStream(System.out, true, "UTF8"));
除非先调用,否则汉字不会正确呈现。
System.getProperty("file.encoding")
即使项目返回"Cp1252"而不是"UTF-8",汉字也会呈现: