idea 新建java类 乱码,idea maven 乱码 控制台

------------------------

根本解决方法:

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里添加

19913882_201912092252570802899931.jpg

19913882_201912092252570865832484.jpg

方法二:创建系统环境变量(一劳永逸):

变量名: JAVA_TOOL_OPTIONS, 变量值:-Dfile.encoding=UTF-8

177624143_1_20191210121643938.png

原因分析:

命令行导致乱码

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已做实验验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值