在Java18之前,Java平台的默认字符集由主机操作系统和语言环境决定,这导致了跨平台应用中字符集不一致的问题。Java18将UTF-8设置为默认字符集,这一改变简化了文本处理,并避免了因地区设置不同而可能导致的乱码问题。
通过下面的代码来看下不同操作系统,不同JAVA版本下的默认编码:
package com.morris.java21;
import java.nio.charset.Charset;
import java.util.Locale;
/**
* 演示不同jdk版本,不同操作系统下默认的字符编码
*/
public class Utf8Demo {
public static void main(String[] args) {
System.out.println(Locale.getDefault());
System.out.println(Charset.defaultCharset());
System.out.println("你好");
}
}
Windows、Java17下运行结果如下:
>java -version
java version "17.0.11" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 17.0.11+7-LTS-207)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.11+7-LTS-207, mixed mode, sharing)
>java Utf8Demo.java
zh_CN
GBK
浣犲ソ
可以看到Windows的Java17下默认编码为GBK,显示中文会乱码,可以通过手动指定jvm参数设置编码来解决乱码问题:
>java -Dfile.encoding=utf-8 Utf8Demo.java
zh_CN
UTF-8
你好
Windows、Java21下运行结果如下:
>java -version
java version "21.0.3" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 21.0.3+7-LTS-152)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.3+7-LTS-152, mixed mode, sharing)
>java Utf8Demo.java
zh_CN
UTF-8
你好
Linux、Java17下运行结果如下:
java -version
java version "17.0.11" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 17.0.11+7-LTS-207)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.11+7-LTS-207, mixed mode, sharing)
java Utf8Demo.java
en
UTF-8
你好
Linux、Java21下运行结果如下:
java -version
java version "21.0.3" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 21.0.3+7-LTS-152)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.3+7-LTS-152, mixed mode, sharing)
java Utf8Demo.java
en
UTF-8
你好
由于默认使用UTF-8编码,Java 18简化了跨平台开发过程,减少了因字符集不一致而导致的错误和复杂性。开发者不再需要显式地设置文件编码或命令行参数来确保正确的字符编码,这提高了开发效率。