首页 > 编程语言 >Java 之 Charset.defaultCharset()

Java 之 Charset.defaultCharset()

时间:2023-02-17 21:33:05浏览次数:45  
标签:charset UTF Charset IDEA cmd Java defaultCharset

 简述

以一个故事^1开局。IDEA 在使用 Gradle 时可能会输出乱码,常见的解决方式是 Custom VM Options 里面增加 -Dfile.encoding=UTF-8。但故事作者通过细致分析找到问题的关键,不同系统间的编解码。

以常见的报错信息为例,自 JavacMessage.getLocalizedString(Locale, ...) 诞生, Gradle DaemonPrintStreamLoggingSystem(javac.util.LogPrintWriter) 接收,并使用 StandardOutputListener(TextStreamOutputEventListener) 通过 LogToClient$AsynchronousLogDispatcher 发送该信息,随后StreamBackedStandardOutputListener 吐给 IDEA。但 IDEA 一律按 UTF-8 处理^2,在此处露出了马脚。

当然,这也不是甚问题,因为编码问题由来已久,Intellij Community 在2019年就已经做出选择,specify UTF_8 charset explicitly^3.

Charset.defaultCharset()

java.nio.charset.Charset.defaultCharset()
 /**
 * Returns the default charset of this Java virtual machine.
 *
 * <p> 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() {}

如 defaultCharset() 方法文档所述,该值的确定时间很早,且一般与系统设置有关。

确定时间早,System.initPhase1() 就完成确定,与 GetJavaProperties 有关。

系统,Unix 有 setlocale <language name>_<country name>.<encoding name>,Windows 有 GetLocaleInfo 之类的。

可通过 file.encoding 进行配置。

相关

  1. JEP 226: UTF-8 Property Resource Bundles
  2. JEP 254: Compact Strings
  3. JEP 400: UTF-8 by Default

附加

Unicode 中文乱码速查表(部分)^4

  示例 产生原因
古文码 鐢辨湀瑕佸ソ濂藉涔犲ぉ澶╁悜涓? 以 GBK 方式读取 UTF-8 编码的中文
口字码 ����Ҫ�¨2�ѧϰ������ 以 UTF-8 的方式读取 GBK 编码的中文

Windows UTF-8

  1. Windows 设置 > 时间与语言 > 非 Unicode 程序的语言 > 「Beta版:使用 Unicode UTF-8 提供全球语言支持」
    • 之前开启后,会有 cmd 代码页、USB 复制失败^5等等问题。
    • 现在开启后,暂未遇到。
  2. cmd 设置 code page
    • HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe

参考

  1. https://juejin.cn/post/7194466056940748859
  2. <com/intellij/openapi/externalSystem/util/OutputWrapper.java#L38>
  3. <intellij-community/commit/995b91a5ded47fe4377b8bb2c909ca30cf3d49f4>
  4. <https://github.com/justjavac/unicode-encoding-error-table>
  5. <answers.microsoft.com > 错误0x800700ea:有更多数据可用>

更多

  1. Debugging Gradle internals from IntelliJ IDEA - Damir Murat
  2. How to Debug Your Own IntelliJ IDEA Instance - Vladimír Oraný

标签:charset,UTF,Charset,IDEA,cmd,Java,defaultCharset
From: https://www.cnblogs.com/UPeRVv/p/17126392.html

相关文章

  • PAT-basic-1004 成绩排名 java
    一、题目读入n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含1个测试用例,格式为第1行:正整数n第2行:第1......
  • Java的IO、NIO和Okio
    二、Java的IO、NIO和Okioio是输入输出流,作用就是对外部进行数据交互使用的,内部和外部分别表示的是内存以及内存以外的,外部包括手机文件,电脑文件和网络,服务器等都称为外部......
  • PAT-basic-1003 我要通过!java
    一、题目“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“......
  • Java面向对象基础
    Java面向对象基础什么是面向对象编程,Java类和对象有什么区别OOP(ObjectOrientedProgramming)编程是利用“类”和“对象”来创建模型实现对真实世界的描述使程序更加......
  • PAT-basic-1002 写出这个数 java
    一、题目读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。输......
  • PAT-basic-1001 害死人不偿命的(3n+1)猜想 java
    一,题目卡拉兹(Callatz)猜想:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡......
  • Java基础知识点(数组遍历以及常见问题)
    一:数组遍历:将数组中的所有内容取出来,取出来之后可以对它进行一系列的操作。注意:遍历指的是取出数据的过程,不要局限的理解为遍历就是打印。在Java中,关于数组的一个长度属性.l......
  • Java基础知识点(数组较难的的一个练习-数组的排序)
    冒泡排序:第一步:从第一个元素开始,将相邻的两个元素进行比较,如果前一个元素比后一个元素大,则交换他们的位置,直到最后两个元素完成比较。整个过程完成后,数组中最后一个元素自然......
  • Java代码生成PDF2.0(包括文字图片)+PDF加水印+PDF转图片
    1.开源框架支持iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件;(简单但是得下载软件)ApachePDFBox,生成、合并PDF文档;(类似于itext)docx4j,生成docx、pptx、xlsx文档,支......
  • JavaScript函数柯里化
    首先说一下什么是函数柯里化吧 函数柯里化:一种将多参数函数转换成一系列使用一个参数的函数的技术,它在函数式编程中非常常见执行的条件:通用的柯里化函数,它接收一个函数......