Благодаря System.out.println(Arrays.toString(“[символ пробела]“.getBytes())) я узнал что код этого странного двухбайтового символа – [-62, -96]. Код стандартного пробела – [0, 32].
При дальнейшем анализе ситуации выяснилось, что в некоторых записях DBF-файла используется стандартный пробел, а в других используется нестандартный пробел. С чем это связано было непонятно, возможно виной пятна на солнце. Хотя есть подозрение что виной утилита для бекапа и восстановления данных, она входит в состав унаследованного программного комплекса.
Проблема решилась следующим образом, перед сравнением строк просходит предварительная обработка данных из DBF-файла: [out] = [in].replaceAll(new String(new byte[] { -62, -96 })),new String(new byte[] { 0, 32 })), и дальше все как обычно.
Потом я нашел в данных DBF-файлов следующие забавные вещи:
- Ошибки в именовании названий объектов, часть написана правильно, а другая часть нет. Например слова: интеллект и интелект.
- Часть данных написана с использованием русской кодировки, другая часть вперемешку используя буквы русской и английской кодировки. Например есть такие буквы “р” и “H”, они одинаково выглядят, но в русской кодировке это одна буква, а в английской совсем другая.