字符串值中的编码器是什么?

What is Coder in String Value?

我正在读取 CSV 文件,使用 com.opencsv.CSVReader 如下所示

String[] headers = csvReader.readNext();

header 的值如下图所示:

这里是什么编码器(以黄色突出显示)?

为什么第一个索引的值为 1 而所有其他索引的值为 0?

官方回应是“none of your business”,因为它是私有成员 :P 这意味着它很可能是特定于实现的,并且在其他供应商的 JVM 版本中找不到。

Stringclass

source code中可以找到实际回复

The identifier of the encoding used to encode the bytes in. The supported values in this implementation are

  LATIN1
  UTF16
 

This field is trusted by the VM, and is a subject to constant folding if String instance is constant. Overwriting this field after construction will cause problems.

至于为什么第一个不同,那取决于每个String是如何实例化的。默认值的选择取决于 JVM 设置的参数。与默认值不同的值表示 String 是从另一个 String 或字节数组构建的。

在第一种情况下,这意味着原始字符串本身具有 coder 值。

在第二种情况下,它取决于调用 StringCoding class 的 decode 方法的结果,其中 returns 具有 [=18] 的对象=] 值设置取决于我上面提到的初始参数(由 JVM 设置的参数)和传递给 String.

的构造函数的编码

正如 Federico klez Culloca 解释了 JVM 如何与字符串编码器一起工作,这是绝对正确的。

Java 字符串 class 有 2 个 Coder 值,如下所示。默认值为 LATIN1 = 0

@Native static final byte LATIN1 = 0;
@Native static final byte UTF16  = 1;

在我的例子中,开始时有一些垃圾字符 (byte order mark in a UTF-8 file),它被添加到 header1 中,JVM 将其标记为 UTF16,因此 coder 的值变为 1。您可以在下面的屏幕截图中看到它。

如果您遇到同样的问题,您可以在十六进制编辑器中打开您的文件并查看隐藏的字符。

https://hexed.it/