我正在阅读一个 CSV 文件,使用com.opencsv.CSVReader
如下所示
String[] headers = csvReader.readNext();
标题的值如下屏幕截图所示:
这里的编码器是什么(以黄色突出显示)?
为什么第一个索引的值为 1,所有其他索引的值为 0?
官方的回应是“不关你的事”,因为它是一个私有成员 :P 这意味着它很可能是特定于实现的,并且在其他供应商的 JVM 版本中找不到。
实际响应可以在该类的源代码中找到String
用于编码字节的编码标识符。此实现中支持的值是
LATIN1 UTF16
该字段受 VM 信任,如果 String 实例为常量,则该字段受常量折叠的影响。构建后覆盖该字段会导致问题。
至于为什么第一个不同,这取决于每个String
实例的实例化方式。默认值的选择取决于 JVM 设置的参数。与默认值不同的值表明它String
是从另一个String
或字节数组构建的。
在第一种情况下,这意味着原始字符串coder
本身具有该值。
在第二种情况下,它取决于调用类的decode
方法的结果,该方法StringCoding
返回一个对象,其code
值取决于我上面谈到的初始参数(JVM设置的那个)和传递给构造函数的编码的String
。
正如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。您可以在下面的屏幕截图中看到它。
如果您遇到同样的问题,您可以在十六进制编辑器中打开您的文件并查看隐藏的字符。