具有非紧凑字符串的 Java 紧凑字符串 equalsIgnoreCase 计算结果为 false

标签 java string equals

在解析 .csv 文件时,我遍历文件的列标题并查看其中一个是否等于(忽略大小写)比较 id:

String comparand = "id";
for (String header : headerMap.keySet()) {
   if (header.equalsIgnoreCase(comparand)) {
      recordMap.put("_id", csvRecord.get(header));
   } else {
      recordMap.put(header, csvRecord.get(header));
   }
}

使用 UTF-8 字符集读取文件:

Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8);

我使用的 CSV 解析器库是 Apache Commons CSV :

CSVParser csvParser = CSVFormat.DEFAULT
   .withDelimiter(delimiter)
   .withFirstRecordAsHeader()
   .withIgnoreEmptyLines()
   .parse(reader);

Map<String, Integer> headerMap = csvParser.getHeaderMap();

上面的 equalsIgnoreCase() 计算结果为 false 而两个字符串的值都是 id

观察调试器显示 header 值是一个非紧凑字符串 (UTF-16) 而 comparand 值是 compact string (ASCII):

Non-compact string vs. compact string

这是默认行为还是错误?我怎样才能使 equalsIgnoreCase 像人们期望的那样评估为 true

最佳答案

您的 header 值以 UTF-16 BOM FFFE 开头.读取 header 时剥离 BOM,然后再与 comparand 进行比较。

关于具有非紧凑字符串的 Java 紧凑字符串 equalsIgnoreCase 计算结果为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55101214/

相关文章:

java - 字符串比较是否相等

java - 如何测试和模拟递归方法?

java - 在Java中,在持久化之前解析嵌套对象时获取并发修改

c - 如何在 C 中逐行读取 .txt?

java - 如何在java中构建url?

java - 如何在android中的不同ArrayList中存储不同的值

c# - 正确实现GetHashCode

Java IRC ping 请求

Java:仅输出字符串的第一个单词?

java - session Bean 上的 Equals 方法