понедельник, 19 июля 2010 г.

Упорядочивание хаоса

Речь пойдет не о сотворении мира а о... кодировках. Точнее о том что с ними могут сделать программисты весьма именитых IT компаний.

Ситуация сложилась презабавная. При копировании строки, содержащейся в некоем элементе GUI некой программы, в.. да куда угодно, получается немыслимая абракадабра.

Пример
îòïðàâëÿåòñÿ

и это кирилица..

Прямым перебором наиболее вероятных кодировок обуздать эту ахинею не смогли не браузеры ни связка человек+iconv

Встал вопрос чтоже это было изначально. Ну и как водится после непродолжительного гугления была нарыта пара рецептов.
1. http://www.artlebedev.ru/tools/decoder/
2. enca

первый заявил:

Как нам пришлось помучиться

CP1252 → CP1251

второй сказал:
# echo 'îòïðàâëÿåòñÿ' | enca
Universal transformation format 8 bits; UTF-8
Doubly-encoded to UTF-8 from ISO-8859-5

чем еще более запутал ситуацию. Прямое преобразование по любой из этих рекомендаций не дает положительного результата. Однако немного помудившись суть вещей таки была выяснена

а дело в следующем. îòïðàâëÿåòñÿ - это уже юникод соответственно если применить преобразование вида
echo 'îòïðàâëÿåòñÿ' | iconv -fUTF8 -tCP1252 | iconv -fCP1251 -tUTF8
то получим нормальную человеческую азбуку.
т.е. похоже декодер лебедева имел ввиду что данные имеющие кодировку CP1251 отобразили как CP1252.

Рассуждения enca по этому поводу я вообще не понял. И двойная трансформация из UTF-8 в ISO-8859-5 не проходит. Однако без ее подсказки о том что это уже UTF-8 я б не догадался до такого извращенного метода трансформации.

3 комментария:

  1. Очень спасибо, эта фигня встречается в Libreoffice и файлами Excel

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
  3. Спасибо. Очень помог такой подход. У меня artlebedev выдавал CP1252 → CP866 и enca "Universal transformation format 8 bits; UTF-8". Сделал по аналогии с вашим решением и все получилось.

    ОтветитьУдалить