Название: неожиданная проблемма с кодировкой нац.алфавита Отправлено: Гурман от Ноябрь 25, 2010, 20:55 наверно FAQ-овый вопрос, если обсуждалось, просьба ткнуть, поиском не нашел
для ввода строки в приложении используется QLineEdit, строка вводится, получена QString потом надо преобразовать в С-строку, поскольку используется библиотека, написанная на С, для этого сделано так (S это полученная в редакторе QString): Код: QByteArray ba = S.toLocal8Bit(); в win все работает, приложение портируется в lin, но в чистой системе пока некогда проверить, делалось в VMWare Player на XP, в KUbuntu 10.10 оказалось, что после преобразования toLocal8Bit() полученный массив содержит испорченный текст, как при открытии в lin UTF-8 текста, созданного в win если же сделать так: Код: QTextCodec c = QTextCodec::codecForName( "Windows-1251" ); то массив 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(); результат совпадает с вариантом Код: QByteArray ba = S.toLocal8Bit(); во всех этих случаях получаю одинаковую строку, являющуюся 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. |