“默认字符编码”和“本机字符编码”是什么意思?

时间:2019-12-13 13:45:40

标签: java android encoding terminology utf-16

一个相关的问题Android default character encoding提到android的“默认字符编码”为UTF-8,字符串为UTF-16。用户Virus721在评论中提出了此问题,但没有适当的答复。

Charset也提到了这一点。它说Java的“本机字符编码”是UTF-16。

“默认字符编码”和“本机字符编码”之间有什么区别?在Android和Java的上下文中,为什么文档会说UTF-8是“默认字符编码”而UTF-16是“本机字符编码”?

1 个答案:

答案 0 :(得分:2)

Java String对象始终被编码为UTF-16。 (*)这是“本机字符编码”。

在将文本转换为字节流时,必须选择一些特定的编码,并且不同的操作系统及其配置在实现方式方面有不同的偏好。

Java引入了“默认字符编码”的概念,该概念试图表示“底层操作系统认为默认字符编码”。

在Android上,“默认字符编码”为UTF-8(幸运的是,这是一种越来越普遍的默认值)。

只要需要将String转换为字节流(例如,写入文件时),Java API(以及因此建立在Java API之上或使用Java API的Android API)通常会使用默认字符编码。或网络连接),并且不提供显式字符编码。

(*)嗯,有一些警告和例外,但是这些通常不是用户可见的。例如,JDK9支持compact strings,其中仅包含ISO-8859-1可编码字符的String对象每个字符实际上仅存储8bit而不是16。但是这种优化(以及在较新的Android中实现的类似优化)版本)不会更改任何String的返回值,因此它们对开发人员是透明的。