Java 18为什么要指定UTF-8为默认字符集
在Java 18中,将UTF-8指定为标准Java API的默认字符集。有了这一更改,依赖于默认字符集的API将在所有实现、操作系统、区域设置和配置中保持一致。
做这一更改的主要目标:
- 当Java程序的代码依赖于默认字符集时,使其更具可预测性和可移植性。
- 阐明标准Java API在哪里使用默认字符集。
- 在整个标准Java API中对UTF-8进行标准化,但控制台I/O除外。
需要注意的是,这一更改的目标并不是定义新的标准Java API或受支持的JDK API,尽管这项工作可能会发现新的便利方法可能会使现有的API更易于使用,这一更改并不是要弃用或删除依赖默认字符集的标准Java API。
用于读写文件和处理文本的标准Java API允许将字符集作为参数传递。字符集控制Java编程语言的原始字节和16位字符值之间的转换。例如,支持的字符集包括US-ASCII、UTF-8和ISO-8859-1。
如果没有传递字符集参数,则标准的Java API通常使用默认的字符集。JDK在启动时根据运行时环境选择默认的字符集:操作系统、用户的区域设置和其他因素。
因为默认字符集在每个地方都不一样,所以使用默认字符集的API会带来许多不明显的危险,甚至对经验丰富的开发人员也是如此。
考虑这样一个应用程序,它在不传递字符集的情况下创建一个java.io.FileWriter,然后使用它将一些文本写入文件。结果文件将包含一个使用运行应用程序的JDK的默认字符集编码的字节序列。第二个应用程序在不同的机器上运行,或者由同一台机器上的不同用户运行,在不传递字符集的情况下创建一个java.io.FileReader,并使用它来读取该文件中的字节。生成的文本包含使用运行第二个应用程序的JDK的默认字符集解码的字符序列。如果第一个应用程序的JDK和第二个应用程序的JDK之间的默认字符集不同,则生成的文本可能会被损坏或不完整,因为FileReader无法判断它使用了相对于FileWriter的错误字符集来解码文本。
比如这就是一个典型的例子,在MacOS上以UTF-8编码的日语文本文件在Windows上以美英或日语区域设置读取时被损坏:
java.io.FileReader(“hello.txt”) -> “こんにちは” (macOS)
java.io.FileReader(“hello.txt”) -> “ã?“ã‚“ã?«ã?¡ã? ” (Windows (en-US))
java.io.FileReader(“hello.txt”) -> “縺ォ縺。縺ッ” (Windows (ja-JP)
在JDK 17及更早版本中,默认字符集是在Java运行时才确定的。在MacOS上,除POSIX C语言环境外,它是UTF-8。在其他操作系统上,取决于用户的区域设置,比如:Windows上,它是基于代码页的字符集,如Windows-1252或Windows-31j。如果不清楚Java应用运行环境的默认编码,可以使用这个命令查看当前JDK的默认字符集:
java -XshowSettings:properties -version 2>&1 | grep file.encoding
程序猿DD Tips:在过去的版本中,当读写文件时,没有指明字符集的话,所选择的字符集与操作系统、用户区域等因素相关,而不同的操作系统的默认编码不同,所以很可能会出现读写编码不一致的情况,从而导致程序在不同系统下运行出现乱码问题。所以这一更改可以让Java开发的应用具备更好的移植性。同时,从这一点的改进,也提醒我们,在读写文件的时候,为了你的应用有更好的可移植性,在涉及读写操作的时候,一定要加上编码参数。这样即使在Java 18之前的版本,也能拥有更好的可移植性,同时为将来升级Java 21提供更好的兼容前提。
本文配套视频:https://www.bilibili.com/video/BV1YY4y1a7vGopen in new window
如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我!持续更新Java新特性教程!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
Java 18为什么要指定UTF-8为默认字符集的更多相关文章
- Java 8 + 10 = Java 18
明天Java 18将正式发布, 虽然它不是长期支持 (LTS) 版本,但它却实现了九个 JEP(在Java 18列出).有哪些特性值得关注呢?今天胖哥为你提前解读.再看.点赞.转发.关注来一波吧. J ...
- Java 18 新功能介绍
文章持续更新,可以关注公众号程序猿阿朗或访问未读代码博客. 本文 Github.com/niumoo/JavaNotes 已经收录,欢迎Star. Java 18 在2022 年 3 月 22 日正式 ...
- Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 J
Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 如果我们 Java 编译后的class文件不在当前目录,我们可以使用 -classpath 来指定class ...
- java中删除list指定元素遇到的问题
java删除list中指定的元素可以用remove()函数,但会存在一个问题,举个例子来说 假如有a,b,c,d,e这个list,用remove()方法删除第一个元素之后,b,c,d,e会往前移动,此 ...
- Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)? 1.返回顶部 1. Java 实例 - 如何执行指 ...
- java Object转换成指定的类型
java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...
- java实现批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码
java实现批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码 作者:Vashon package com.ywx.batchrename; import java.io.File; import ...
- Error:java: 发现警告, 但指定了 -Werror
最近在使用IntelliJ IDEA编译Apache Guacamole Web项目时,遇到了一个罕见的bug:"Error:java: 发现警告, 但指定了 -Werror",见 ...
- IDEA 2022.2.1 Beta 2发布:新增支持Java 18、增强JUnit 5的支持
近日,IDEA 2022.1的Beta 2版本发布了!下面我们一起来看看对于我们Java开发者来说,有哪些重要的更新内容. Java增强 随着Java 18的正式发布,IDEA也在该版本中迅速跟进.目 ...
随机推荐
- (转)String,StringBuilder,StringBuffer区别
Java中的String,StringBuilder,StringBuffer三者的区别 注:转自-博客园-酥风 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuild ...
- 转:怎样理解OOP?OOP又是什么?
本文转载至:https://blog.csdn.net/q34323201/article/details/80198271. OOP面向对象编程.OOP思想中很重要的有五点,类,对象,还有面向对象的 ...
- kafka producer 源码总结
kafka producer可以总体上分为两个部分: producer调用send方法,将消息存放到内存中 sender线程轮询的从内存中将消息通过NIO发送到网络中 1 调用send方法 其实在调用 ...
- 区分构造函数注入和 setter 注入?
构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...
- 自启动Servlet
自启动servlet也叫自动实例化servlet 特点 该Servlet的实例化过程不依赖于请求,而依赖于容器的启动,当Tomcat启动时就会实例化该Servlet 普通Servlet是在浏览器第一次 ...
- Asp.Net Core之Identity应用(下篇)
一.前言 在上篇中简单介绍了 Asp.Net Core 自带的 Identity,一个负责对用户的身份进行认证的框架,当我们按需选择这个框架作为管理和存储我们应用中的用户账号数据的时候,就会添加到自己 ...
- Chrome 53 Beta一些有意思的改动
原文链接: http://blog.chromium.org/2016...译者:Icarus邮箱:xdlrt0111@163.com 如果没有特殊说明的话,以下都是应用在Android,Chrome ...
- 前端面试题整理——VUE相关题目与回答
1.v-if与v-show的区别? v-if的原理是根据判断条件来动态的进行增删DOM元素, v-show是根据判断条件来动态的进行显示和隐藏元素,频繁的进行增删DOM操作会影响页面加载速度和性能所以 ...
- 手绘模型图带你认识Kafka服务端网络模型
摘要:Kafka中的网络模型就是基于主从Reactor多线程进行设计的. 本文分享自华为云社区<图解Kafka服务端网络模型>,作者:石臻臻的杂货铺 . Kafka中的网络模型就是基于主从 ...
- 【Android开发】jarsigner重新打包apk
签名(sign):在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核. 过程:使用私有密钥数字地签署一个给定的应用程序. 作用: 识别应用程序作者: 检測应用程序是否发生改变: ...