equals или not equals, вот в чем вопрос :)

Довелось мне столкнуться с одним унаследованным программным комплексом, десятилетней выдержки. Написан он на фоксе и для хранения данных использует DBF-файлы. Так вот, при загрузке данных из этой унаследованной штуки, вдруг обнаружилось что “[какой-то текст 1][символ пробела][какой-то текст 2]“.equals(“[какой-то текст 1][символ пробела][какой-то текст 2]“) == false. Вначале я впал в небольшой ступор, но потом появилась мысль! Дело в кодировке, а точнее в наборе символов (Charset)!

Благодаря 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”, они одинаково выглядят, но в русской кодировке это одна буква, а в английской совсем другая.
Вообщем я обеспокоен интеллектом создателей это унаследованной системы Они наверно даже не знают что такое нормализация базы данных :)