

Java 18 新功能:默认编码为 UTF-8
source link: https://blog.csdn.net/csdnnews/article/details/124248441
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

整理 | 张仕影
出品 | CSDN(ID:CSDNnews)
上个月,Oracle 官网发布了 JDK 18/Java 18 正式版。据悉,Java 18 在性能、稳定性和安全性上得到了全面的改进提升,其中包括对平台的九项 JDK 增强(JEP),大大提升了开发人员的工作效率。
已知 JDK 18 版本主要集中在 9 个增强功能上,其中之一即是将 UTF-8 设置为标准 Java API 的默认字符集。在 JDK 17 及更早版本中,默认字符集要在 Java 虚拟机运行时才能确定,所以取决于不同的操作系统、语言环境等因素,在实现和处理方面存在着一些问题。而从 Java 18 开始,依赖于默认字符集的 API 会在所有实现、操作系统、语言环境和配置中保持一致。
默认为 UTF-8 前存在的问题
默认字符集通常是在以下这个函数中计算的:
Charset.defaultCharset()
在 Javadoc(javadoc 命令是用来生成自己 API 文档的)中有一句话:“默认字符集是在虚拟机运行时确定的,通常根据语言环境和底层操作系统使用的字符集来确定。”这意味着默认字符集在不同的操作系统、地理区域和用户偏好之间可能会有很大差异,也就是说甚至有可能同一台物理机上的两个用户具有不同的默认字符集。
此外,如果我们在构建过程中没有指定任何字符集,那么像 java.io.FileWriter 或 java.io.FileReader 这样较旧的 JDK API 将会使用默认字符集进行写入操作;而在新的版本中,像 java.nio.file.Files 这样的新 API 将默认为 UTF-8。
还有就是许多开发者依靠不受支持的系统属性 file.encoding 在 JVM(Java虚拟机)启动时设置默认字符集。虽然有一些 JVM 可能支持它,但这并不能保证其他 JVM 也支持。
默认为 UTF-8 的好处
Java 18 将 UTF-8 作为所有实现、操作系统、语言环境和配置的默认字符集。那么,所有依赖于默认字符集的 API 将会表现一致,而不需要设置 file.encoding 系统属性,也不需要在创建相应对象时总是指定字符集。我们都知道字符集一致的重要性,而默认为 UTF-8 将能提高我们软件的可靠性和一致性,是一个非常受欢迎的变化。
仍有一些问题存在
如果我们想让 JDK 18 表现得和以前的版本一样,那么我们必须以 -Dfile.encoding=COMPAT 启动 JVM,比如我们有一些无法重新编译的源代码,并且它依赖于和 UTF-8 不同的默认字符集,那就需要这样做。而在所有其他情况下,不必设置此属性。不过要注意,在你使用 -Dfile.encoding=COMPAT 和 java.nio.file.Files 中的函数,而不定义字符集但回退到 UTF-8 的情况下,你会回到原点——你的应用程序的某些部分将以 UTF-8 读取/写入文件,而其他部分则用运行中 JVM 的默认字符集。
在 JDK 17 及之前版本中,我们都可以写入 Charset.forName(“default”) 来获得 JVM 的默认字符集。而在 JDK 18 中,该行代码将会抛出一个 UnsupportedCharsetException。因此,如果我们的源代码中有这句话,或是我们使用任何包含此语句的库,我们的应用程序就会在运行时抛出该异常。
关于该功能的更多具体细节及规范可参考 JEP 400 (https://openjdk.java.net/jeps/400)。
参考链接:https://thejavaguy.org/posts/006-new-in-java-18-utf8-by-default/#compatibility-with-previous-jdks
Recommend
-
55
1.字符串 字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、 float32、foat64等)一样。 字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCⅡ码字符 Go...
-
15
UEFI开发探索58-UTF-8编码问题 请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】...
-
10
go语言中的UTF-8与GBK编码转换零一间2021.01.24 21:46:41字数 111阅读 39场景: 在做网页爬虫类项目时候,经...
-
19
charset=utf-8和 charset=gb2312编码的不同 作者: JavasBoy 分类: 学习 发布时间: 2008-...
-
6
Java 18将指定UTF-8作为标准Java API的默认字符集 20 多年后Java终于将默认字符集更改为 UTF-8 ,可能存在重大风险,亚洲地区的 Windows 用户以及亚洲和其...
-
5
UTF-8编码中BOM的检测与删除 浏览:3639次 出处信息 所谓BOM,全称是
-
6
Java 18 新特性:指定UTF-8为默认字符集 最近,我花了两周的时间,给大家...
-
8
1 题目描述 2 位运算 + 遍历 O(m)根据题意,我们可以先将整数数组转化...
-
6
ASCII码 使用一个字节(8位),对128个字符进行编码; 最高位始终为0; 码数范围为0000_0000(0x00)到0111_1111(0x7F); Unicode 开始的编码设计
-
2
介绍 UTF-8 编码 UTF-8 是一种针对 Unicode 的可变长度字符编码。 针对 Unicode:UTF-8 是 Unicode 的实现方式之一。相当于 Unicode 规定了字符对应的代码值,这个代码值需要转换为字节序列的形式,用于数据...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK