------------------------
根本解决方法:
Setting->maven->runner VMoptions:-Dfile.encoding=GB2312
或者 -Dfile.encoding=GBK
------------------------
其他方法:
1. jdbc:mysql://localhost:3306/sheep?characterEncoding=utf-8 连接数据库取数据层面
2. idea64.exe.vmoptions(32位的是idea.exe.vmoptions)添加-Dfile.encoding=UTF-8
3. Setting->Editor->File Encodings 设置UTF-8
4. 设置windows环境变量 变量名: JAVA_TOOL_OPTIONS, 变量值:-Dfile.encoding=UTF-8
5. run-->edit configurations VM options一栏:-Dfile.encoding=UTF-8
问题:
windows下,idea里,setting-->file encoding改成utf-8后,maven工程System.out.println()控制台出现中文乱码。但java工程不是乱码。
解决方法:
将jvm默认编码设置为UTF-8
方法一:run-->edit configurations,在需要的类上,VM options里添加
方法二:创建系统环境变量(一劳永逸):
变量名: JAVA_TOOL_OPTIONS, 变量值:-Dfile.encoding=UTF-8
原因分析:
命令行导致乱码
JAVA_TOOL_OPTIONS用于解决的经典问题是使用命令行导致中文乱码,通过设置环境变量JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"一般可以解决。(https://blog.csdn.net/ly199108171231/article/details/85253946)
maven工程恰恰是用命令行启动。分析:应该是命令行没有输入相关参数,导致了输出乱码。
java工程和maven工程里的-Dfile.encoding=UTF-8
以下是java工程执行时的命令行,红色行-Dfile.encoding=UTF-8后面跟着jdk里的包E:\java\tts9-v2-win-x64\tts9\jdk1\bin\java.exe
+
+
+
E:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\deploy.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\access-bridge-jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\cldrdata.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\dnsns.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\jaccess.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\jfxrt.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\localedata.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\nashorn.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\sunec.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\sunjce_provider.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\sunmscapi.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\sunpkcs11.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\ext\zipfs.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\javaws.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\jce.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\jfr.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\jfxswt.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\jsse.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\management-agent.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\plugin.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\resources.jarE:\java\tts9-v2-win-x64\tts9\jdk1\jre\lib\rt.jarD:\IDEAProject\leyou\code\demo7\out\production\test-encoding-java b.Test2
以下是maven工程执行时的命令行(已加入了-Dfile.encoding=utf-8参数):
没有加参数,则红色行里没有-Dfile.encoding=UTF-8E:\java\tts9-v2-win-x64\tts9\jdk1\bin\java.exe
-Dmaven.multiModuleProjectDirectory=D:\IDEAProject\leyou\code\demo7\test-encoding
-DarchetypeCatalog=internal -Dmaven.home=D:\java_tool\apache-maven--Dclassworlds.conf=D:\java_tool\apache-maven-\bin\m2.conf
+
+
-Dfile.encoding=UTF--classpath D:\java_tool\apache-maven-\boot\plexus-classworlds-.jar
org.codehaus.classworlds.Launcher -Didea.version2019-s D:\java_tool\apache-maven-\conf\settings.xml
-Dmaven.repo.local=D:\heima\.m2\repository -Dexec.workingdir=D:\IDEAProject\leyou\code\demo7
-Dexec.executable=E:\java\tts9-v2-win-x64\tts9\jdk1\bin\java.exe exec:exec
检查jvm默认编码import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
class HelloWorld {
public static void main(String[] args) {
System.out.println("Default Charset=" + Charset.defaultCharset());//gbk
System.out.println("file.encoding=" + System.getProperty("file.encoding"));//gbk
System.out.println("Default Charset in Use=" + getDefaultCharSet());//gbk
}
private static String getDefaultCharSet() {
OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
String enc = writer.getEncoding();
return enc;
}
}
jvm启动参数设置-Dfile.encoding=utf-8
注意事项:开发工具里project设置为utf-8,同时设置-Dfile.encoding=utf-8
-Dfile.encoding解释:
在命令行中输入java,在给出的提示中会出现-D的说明:
-D= set a system property
-D后面需要跟一个键值对,作用是设置一项系统属性
对-Dfile.encoding=UTF-8来说就是设置系统属性file.encoding为UTF-8
那么file.encoding什么意思?字面意思为文件编码。
搜索java源码,只能找到4个文件中包含file.encoding的文件,也就是说只有四个文件调用了file.encoding这个属性。
在java.nio.charset包中的Charset.java中。这段话的意思说的很明确了,简单说就是默认字符集是在java虚拟机启动时决定的,依赖于java虚拟机所在的操作系统的区域以及字符集。
代码中可以看到,默认字符集就是从file.encoding这个属性中获取的。个人感觉这个是最重要的一个因素。下面的三个可以看看。/**
* Returns the default charset of this Java virtual machine.
*
*
The default charset is determined during virtual-machine startup and
* typically depends upon the locale and charset of the underlying
* operating system.
*
* @return A charset object for the default charset
*
* @since 1.5
*/
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}
在java.net包中的URLEncoder.java中的static块里面:
dfltEncName = (String)AccessController.doPrivileged (
new GetPropertyAction("file.encoding")
);
在javax.print包中的DocFlavor.java
static {
hostEncoding =
(String)java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("file.encoding"));
}
在com.sun.org.apache.xml.internal.serializer包中的Encodings
// Get the default system character encoding. This may be
// incorrect if they passed in a writer, but right now there
// seems to be no way to get the encoding from a writer.
encoding = System.getProperty("file.encoding", "UTF8");
mac系统中,Jar Launcher.app启动jar文件时,file.encoding属性变成MacRoman
未解决的问题:
java工程中,file.encoding无论是gbk还是utf-8,控制台都不会中文乱码。
idea和cmd已做实验验证。