【问题标题】:Why UTF-8 is used in class file and UTF-16 in in runtime?为什么在类文件中使用 UTF-8 而在运行时使用 UTF-16?
【发布时间】:2016-12-30 09:26:03
【问题描述】:

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

【问题讨论】:

  • 为什么不呢?如果 JVM 需要 UTF-16 但编译后的文件不需要怎么办?有什么问题?
  • @AxelH 放松。他只是想知道为什么 JVM 需要 UTF-16 而不是 UTF-8。这是合法的!
  • @AhmadWabbi 我没有说他的问题很愚蠢......我只是提出了一些想法......

标签: java encoding


【解决方案1】:

为什么 .class 是 UTF-8

对于为西方读者编写的课程,通常主要是 ASCII,这是最紧凑的编码。

但运行时 .class 是 UTF-16 吗?

在运行时处理使用固定宽度编码 (Why Java char uses UTF-16?) 的字符串会更快,因此选择了 UCS-2。从 UCS-2 到 UTF-16 的变化使得这成为另一种可变宽度编码,这使得这变得复杂。

如该问题的 cmets 所述,JEP 254 允许将运行时表示更改为更节省空间的内容(例如 Latin-1)。

【讨论】:

  • 在运行时处理使用固定宽度编码的字符串会更快 => 引入它时实际上是固定宽度的编码,还是已经有了这样的概念需要多个代码点的字形?
  • 排序;尽管 UTF-16 从 1996 年首次出现在 Unicode 2.0 (unicode.org/faq/utf_bom.html) 开始就支持可变宽度编码,但 UTF-16 在 2001 年的 Unicode 3.1 之前实际上是固定宽度的,它仅在 J2SE 5 (oracle.com/us/technologies/java/supplementary-142654.html) 中得到支持.
【解决方案2】:

源代码可以有任何编码,你也可以使用-encoding标志告诉编译器使用什么编码。

JVM 使用 UTF-16,并在 JLS 中指定:

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

【讨论】:

  • 这不能回答问题;问题是关于.class-文件的编码,而不是.java 文件。
【解决方案3】:

javac encoding

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

JVM encoding:

Java 虚拟机的每个实例都有一个默认字符集, 这可能是也可能不是标准字符集之一。默认 字符集在虚拟机启动期间确定,通常 取决于底层使用的语言环境和字符集 操作系统。

【讨论】:

  • 这不能回答问题;问题是关于.class-文件的编码,而不是.java 文件。
  • 对于问题“为什么 .class 是 UTF-8”的第一部分 - 当您使用 javac 编译 java 文件以获取 .class 文件时,它使用默认编码,而未指定 -encoding 选项。问题的第二部分“但运行时 .class 是 UTF-16?”在运行时 jvm 处理本机库,因此处理 UTF-16
  • 再一次,这并不能回答问题。你一直在谈论源文件,问题是编译后的class文件中使用的编码,它总是UTF-8,Java进程在运行时使用UTF-16。
猜你喜欢
  • 2016-11-14
  • 1970-01-01
  • 2013-05-20
  • 2021-07-01
  • 2012-03-24
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多