3

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

String[] headers = csvReader.readNext();

标题的值如下屏幕截图所示:

在此处输入图像描述

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

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

4

2 回答 2

7

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

实际响应可以在该类的源代码中找到String

用于编码字节的编码标识符。此实现中支持的值是

  LATIN1
  UTF16
 

该字段受 VM 信任,如果 String 实例为常量,则该字段受常量折叠的影响。构建后覆盖该字段会导致问题。

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

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

在第二种情况下,它取决于调用类的decode方法的结果,该方法StringCoding返回一个对象,其code值取决于我上面谈到的初始参数(JVM设置的那个)和传递给构造函数的编码的String

于 2020-07-15T14:30:40.530 回答
1

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

Java String 类有 2 个 Coder 值,如下所示。默认值为LATIN1 = 0

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

就我而言,开始时有一些垃圾字符(UTF-8 文件中的字节顺序标记),它被添加到 header1 中,JVM 将其标记为 UTF16,因此 coder 的值变为 1。您可以在下面的屏幕截图中看到它。

在此处输入图像描述

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

https://hexed.it/

于 2020-07-16T08:49:09.737 回答