Java 为什么在类文件中使用UTF-8,在运行时使用UTF-16?

Java 为什么在类文件中使用UTF-8,在运行时使用UTF-16?,java,encoding,Java,Encoding,为什么.class是UTF-8,而运行时.class是UTF-16 源代码可以有任何编码,您还可以使用该标志告诉编译器要使用什么编码 JVM使用UTF-16,并在以下文件中指定: Java编程语言使用UTF-16编码以16位代码单元的序列表示文本 : -encodingencoding设置源文件编码名称,如EUC-JP和UTF-8。如果未指定-编码,则平台默认 使用变频器 : Java虚拟机的每个实例都有一个默认字符集, 它可能是标准字符集之一,也可能不是。默认值 字符集在虚拟机启动期间确定,通

为什么
.class
是UTF-8,而运行时
.class
是UTF-16


源代码可以有任何编码,您还可以使用该标志告诉编译器要使用什么编码

JVM使用UTF-16,并在以下文件中指定:

Java编程语言使用UTF-16编码以16位代码单元的序列表示文本

:

-encoding
encoding设置源文件编码名称,如EUC-JP和UTF-8。如果未指定
-编码
,则平台默认 使用变频器

:

Java虚拟机的每个实例都有一个默认字符集, 它可能是标准字符集之一,也可能不是。默认值 字符集在虚拟机启动期间确定,通常 取决于基础服务器使用的区域设置和字符集 操作系统

为什么?课程是UTF-8

对于为西方读者编写的类(通常是ASCII),这是最紧凑的编码

但是runtime.class是UTF-16吗

在运行时,操作使用固定宽度编码()的字符串会更快,因此选择了UCS-2。从UCS-2到UTF-16的变化使这一点变得复杂,这又是一种可变宽度编码


如该问题的评论所述,允许运行时表示更改为更节省空间的形式(例如,拉丁语-1)。

为什么不?如果JVM需要UTF-16,但编译的文件不需要呢?有什么问题吗?@AxelH放松点。他只是想知道为什么JVM需要UTF-16而不是UTF-8。这是合法的@艾哈迈德瓦比我没说他的问题很愚蠢。。。我只是想指出一些想法……可能的重复并不能回答这个问题;问题是关于
.class
-文件的编码,而不是
.java
文件;问题是关于
.class
-文件的编码,而不是
.java
文件。对于问题“为什么.class是UTF-8”的第一部分,当您编译java文件以使用javac获取.class文件时,它使用默认编码,而未指定-encoding选项。运行时jvm上的问题“但是runtime.class是UTF-16?”的第二部分涉及本机库,因此UTF-16同样不能回答这个问题。您一直在谈论源文件,问题是编译的
文件中使用的编码始终是UTF-8,Java进程在运行时使用UTF-16。在运行时,使用固定宽度编码的字符串操作更快=>引入编码时,编码的实际宽度是否固定,或者已经有了需要多个代码点的图形的概念;尽管UTF-16从1996年第一次出现在Unicode 2.0()中就支持可变宽度编码,但在2001年Unicode 3.1之前,UTF-16实际上是固定宽度的,只有J2SE 5()支持这种编码。