java - 当我在java代码中指定它是UTF-8时,为什么文本文件编码仍然是ANSI

标签 java

我正在使用 FileWriter 对象将一些文本写入文件。我指定我希望输出采用 UTF-8 格式,但是当我打开文本文件并另存为时,我看到它采用 ANSI 编码。

我还想补充一点,当存在标准 ascii 字符集以外的字符(例如:- 日语字符)时,文件编码为 UTF-8,但如果没有,则文本文件编码为 ANSI。

File json_file= new File(path);
FileWriter json_file_output=newFileWriter(json_file,StandardCharsets.UTF_8);
json_file_output.write("SOME JSON TEXT HERE");
json_file_output.flush();

我不确定这是由于java代码还是记事本引起的。

感谢您的帮助。

最佳答案

Unicode 是 US-ASCII 字符集的超集,
UTF-8 是 8 位 US-ASCII 字符编码的超集

不存在 ANSI encoding 这样的东西。请参阅What is ANSI format? .

可能的意思是US-ASCII每个 8 位 US-ASCII 文件也是一个 UTF-8 文件。 Unicode 是 US-ASCII 的超集。当使用八位字节写出时,ASCII 文件是 UTF-8 文件。 UTF-8 编码是故意这样设计的,是为了兼容。

US-ASCII 是一个 7 位字符集,只有 128 个字符,编号为 0-127。因此,如果使用 octets 编写( 8-bits ),每个八位字节的第一位都是零。请参阅Wikipedia page on UTF-8 encoding ,并注意第一位所扮演的角色。

没有文件元数据

了解 US-ASCII 文件和 UTF-8 文件(没有 BOM )只是一堆位,没有元数据。不幸的是,计算机行业从未成功建立文件系统元数据的标准。因此应用程序必须猜测内容的内容,或者用户必须指示预期的格式。

您的文本编辑器可能会查看文件中找到的字符域,然后尝试使用尽可能最小范围的编码来保守地标记文件。如果只有 US-ASCII 字符,则标记为 US-ASCII(并且显然误报为“ANSI”)。一旦添加了代码点超出 ASCII 的更高编号的字符,就标记为 UTF-8。

<小时/>

有关背景信息,例如字符集字符编码之间的区别,请参阅:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

关于java - 当我在java代码中指定它是UTF-8时,为什么文本文件编码仍然是ANSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447896/

相关文章:

java - 未找到 Froyo、adSize 和 adUnitId 的 Google Play 服务

java - 在参数中传递一个数组对象

java - 跨异步调用的流程执行/逻辑上下文

java - 计算周、月和年的第一天和最后一天的最佳方法

java - 如何在应用所有样式并删除 javascript 的情况下捕获运行时 html 内容/状态

java - 项目调度GA : efficient data structure for the chromosome

java - 字符串转二进制?

java - 卡宴 : Updating database with manually created instances of classes generated by cayenne

java - 我对 switch 语句的理解有什么问题?

java - Xpages - 获取 Activity session 数 (Lotus Domino 8.5.2)