среда, 12 августа 2009 г.

Кодировки и BOM

Довольно забавно обстоит дело с обработкой компилятором от Microsoft строковых литералов в программах на C++. В случаях с символами, попадающими в первые 7 бит (ANSI) всё ясно - всегда всё нормально. Но с родной кириллицей всё веселее.
И редактор студии, и компилятор умеют определять используемую кодировку. Вот только редактор делает это лучше.
Пример: есть файлы в UTF-8 без BOM, созданные под GNU/Linux, с программой на Qt. g++ сохраняет кодировку в литералах и в памяти программы строка оказывается в кодировке UTF-8. И перевести её потом в QString можно при помощи fromUtf8.
Компилятор же от Microsoft не видя BOM считает, что кодировка файла соответствует локали и тоже оставляет строковые литералы как есть. Но, так он неверно определяет кодировку, вместо unicode-литералов (это те, которые L"текст") в памяти получается мусор.
Пример:

MessageBox(0, L"Привет", L"Мир", MB_OK);



Если же файл сохранить с BOM, то тогда компилятор догадывается что это UTF-8 и переводит обычные строки в локальную кодировку, зато и unicode-строки воспринимает правильно. И прощай один код для двух платформ, придётся пользоваться fromLocal8Bit под Windows и fromUtf8 под GNU/Linux.
Кроме того, g++ хоть и формально умеет работать с UTF-8, но к BOM относится враждебно, отказываясь компилировать, что опять же не позволяет использовать один исходник для обеих платформ.

Вывод: либо смириться и не использовать кириллицу в исходном коде, либо не использоваться Unicode-литералы и пользоваться QString::fromUft8 везде.

Примечание: Стандарт не разрешает использовать национальные символы даже в литералах, вместо этого надо указывать код символа (например '\320'), так что лучше кириллицу в исходниках не использовать вовсе. С другой стороны Qt предлагает удобные утилиты и классы для перевода. Другое дело что это почти всегда неудобно, особенно когда программа пишется только для русскоязычных пользователей и возиться с переводом того что можно сразу сделать на русском не хочется.

Комментариев нет:

Отправить комментарий