Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Ноябрь 25, 2010, 20:55



Название: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Гурман от Ноябрь 25, 2010, 20:55
наверно FAQ-овый вопрос, если обсуждалось, просьба ткнуть, поиском не нашел

для ввода строки в приложении используется QLineEdit, строка вводится, получена QString

потом надо преобразовать в С-строку, поскольку используется библиотека, написанная на С, для этого сделано так (S это полученная в редакторе QString):

Код:
QByteArray ba = S.toLocal8Bit();
char* s = ba.data();

в win все работает,

приложение портируется в lin, но в чистой системе пока некогда проверить, делалось в VMWare Player на XP, в KUbuntu 10.10

оказалось, что после преобразования toLocal8Bit() полученный массив содержит испорченный текст, как при открытии в lin UTF-8 текста, созданного в win

если же сделать так:

Код:
QTextCodec c = QTextCodec::codecForName( "Windows-1251" );
QByteArray ba = c->fromUnicode( S );
char* s = ba.data();

то массив ba и соответственно строка s получаются в эмуляторе читабельные

я так понимаю, 1251 кодировка вылазит из-за того, что это все происходит в эмуляторе, работающем в windows, если нет, то поправьте

очевидно, что привязывать к конкретной национальной кодировке нет смысла - во-1ых, в lin должно быть все нормально (завтра только смогу проверить), во-2ых программа может использоваться и с другими национальными кодировками

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



Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: tim474 от Ноябрь 25, 2010, 21:48
VMWare тут ни при чём, на реальном железе будет работать так же. В Ubuntu 10.10,  как и в большинстве современных дистрибутивов, системной кодировкой является UTF-8. Поэтому надо преобразовывать не в национальную восьмибитную кодировку, а в UTF8 (в зависимости от твоей библиотеки, строка может представлять массив char-ов или wchar-ов).


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Гурман от Ноябрь 25, 2010, 22:00
для библиотеки нужны char, а не wchar

но если VMWare ни при чем - то откуда появляются символы в кодировке 1251, почему при конвертировании с этим кодеком текст правильный??

но софт должен работать и в win, без изменений - а там работает toLocal8Bit(), хотя можно конечно, условной трансляцией...


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Гурман от Ноябрь 25, 2010, 22:11
Код:
QByteArray ba = S.toUtf8();
char* s = ba.data();

результат совпадает с вариантом

Код:
QByteArray ba = S.toLocal8Bit();
char* s = ba.data();

во всех этих случаях получаю одинаковую строку, являющуюся char-представлением Unicode строки


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: tim474 от Ноябрь 25, 2010, 22:15
Не знаю, откуда берутся, но toLocal8Bit(), по-идее, в linux  с utf8 не должно работать, поскольку utf8 не является 8-битной кодировкой. Я в подробности этого дела не вдавался, но QTextCodec * QTextCodec::codecForLocale () не помогает?
Ещё могут быть нюансы с той библиотекой, может она не умеет корректно работать с utf8.


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Гурман от Ноябрь 25, 2010, 22:24
библиотека тут совершенно ни при чем, ее функции используются потом, надо для этого сформировать строку в текущем системном 8-и битном эквиваленте unicode-представления, поскольку работать она умеет только с 8-и битными символами

toLocal8Bit, согласно документации, возвращает строку в 8-и битной кодировке, в чистом Linux это, по идее, должна быть koi8-r - а в виртуальной машине похоже это 1251...

завтра проверю на Kubuntu 10.10 на обычной машине, правда там памяти очень мало, компиляция медленная из-за свопинга


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: BRE от Ноябрь 25, 2010, 22:48
2 Гурман
А у тебя в main есть подобные строки:
QTextCodec::setCodecFor...


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Гурман от Ноябрь 25, 2010, 22:57
а черт... и правда есть, другой программист main() писал больше года назад... спс, вопрос снят


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: deaks от Ноябрь 26, 2010, 01:36
другой программист main() писал больше года назад
:D


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Авварон от Ноябрь 26, 2010, 01:49
олол, покажите мне тот линупс, где кодировка не utf-8?
Даже винда вся из себя юникодовская внутрях, но все старательно используют убогие cp1251 и иже с ними


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: lit-uriy от Ноябрь 26, 2010, 06:29
>>поскольку utf8 не является 8-битной кодировкой.
а сколькиж она битная, если не 8-ми?


Название: Re: неожиданная проблемма с кодировкой нац.алфавита
Отправлено: Пантер от Ноябрь 26, 2010, 10:09
Цитировать
Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode не определяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.