Компактная строка Java equalsIgnoreCase с некомпактной строкой оценивается как ложная - PullRequest
1 голос
/ 11 марта 2019

При синтаксическом анализе файла .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 charset:

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 является компактной строкой (ASCII):

Non-compact string vs. compact string

Это поведение по умолчанию или ошибка?Как я могу заставить equalsIgnoreCase оценить true, как и следовало ожидать?

1 Ответ

3 голосов
/ 11 марта 2019

Ваше значение header начинается с UTF-16 BOM FFFE. Снимите спецификацию, читая header, прежде чем сравнивать ее с comparand.

...