При синтаксическом анализе файла .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](https://i.stack.imgur.com/GStto.png)
Это поведение по умолчанию или ошибка?Как я могу заставить equalsIgnoreCase
оценить true
, как и следовало ожидать?