"default character encoding" 和 "native character encoding" 是什么意思?

What is the meaning of "default character encoding" and "native character encoding"?

一个相关问题Android default character encoding mentions that the "default character encoding" for android is UTF-8 and strings are in UTF-16. A user Virus721在评论里问了这个问题,但是没有合适的回复。

Charset也提到了这一点。它说 "native character encoding" for Java 是 UTF-16.

"default character encoding" 和 "native character encoding" 有什么区别?在 Android 和 Java 的上下文中,为什么文档说 UTF-8 是 "default character encoding" 而 UTF-16 是 "native character encoding"?

Java String 对象始终编码为 UTF-16。 (*) 这是 "native character encoding".

将文本转换为字节流时,必须选择一些特定的编码,不同的操作系统及其配置对如何完成有不同的偏好。

Java 引入了 "default character encoding" 的概念,试图表示 "the character encoding that the underlying operating system considers the default".

在 Android 上,"default character encoding" 是 UTF-8(幸运的是这是一个越来越普遍的默认值)。

Java API(以及因此构建在 Java API 之上或使用 Java API 的 Android API)通常在 String 需要时使用默认字符编码被转换为字节流(例如写入文件或网络连接时)并且没有提供明确的字符编码。

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