Jan 19, 2008 23:29
Рассказал один знакомый программист.
Есть проект с одной библиотекой, которая присылает данные в формате MARC (стандартные библиографические описания), и эти данные нужно анализировать и складывать в базу данных.
Собственно, это лишь маленькая подзадача одной большой задачи и потому была поручена подмастерью рассказчика. Подмастерье -- не по годам шустрый студент не самого первого (впрочем, и не самого последнего) курса одного московского вуза.
Для определённости, будем называть вуз "МФТИ" (из песни слова не выкинешь).
Для определённости же, будем называть студента "Аникей" (есть такое русское имя).
Любые совпадения, разумеется, случайны.
Библиотека утверждала, что присылает данные в кодировке UTF-8.
(Сами файлы бинарные, но вот нек-рые внутренние поля там -- текстовые, причём в определённой кодировке.)
Аникей, впрочем, оказался парень не промах и решил проверить, правду ли говорит библиотека. Оказалось -- нишиша. Никакая не UTF-8, а старая добрая досовская CP866. О чём было радостно сообщено старшему программисту.
Аникею поверили, с библиотекой же был проведён серьёзный разговор, и первая часть проекта была успешно сдана.
Впоследствии старший программист решил собственноручно проверить, что же написал Аникей. От ужаса седые волосы зашевелились на голове старика.
Данные читались в кодировке CP866:
final MarcReader reader = new MarcStreamReader(..., "CP866")
а затем каждая считанная строка дополнительно преобразовывалась из CP866 в UTF-8:
final String s0 = ...;
final String s1 = new String(s0.getBytes("CP866"), "UTF-8");
CP866 в этом примере можно заменить на что угодно -- пример будет работать. Так же корректно -- и так же неэффективно. Почему было сразу не читать в UTF-8 (и вообще избавиться от преобразования строк) -- тайна за семью печатями.
Рассказ завершился весьма оптимистично: "С паршивой овцы -- хоть шерсти клок".
Снова индусофобия, только на этот раз не у меня.
индусофобия