Russian Qt Forum
Ноябрь 25, 2024, 08:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: неожиданная проблемма с кодировкой нац.алфавита  (Прочитано 5968 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Ноябрь 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ых программа может использоваться и с другими национальными кодировками

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

Записан

2^7-1 == 127, задумайтесь...
tim474
Гость
« Ответ #1 : Ноябрь 25, 2010, 21:48 »

VMWare тут ни при чём, на реальном железе будет работать так же. В Ubuntu 10.10,  как и в большинстве современных дистрибутивов, системной кодировкой является UTF-8. Поэтому надо преобразовывать не в национальную восьмибитную кодировку, а в UTF8 (в зависимости от твоей библиотеки, строка может представлять массив char-ов или wchar-ов).
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Ноябрь 25, 2010, 22:00 »

для библиотеки нужны char, а не wchar

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

но софт должен работать и в win, без изменений - а там работает toLocal8Bit(), хотя можно конечно, условной трансляцией...
« Последнее редактирование: Ноябрь 25, 2010, 22:12 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Ноябрь 25, 2010, 22:11 »

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

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

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

во всех этих случаях получаю одинаковую строку, являющуюся char-представлением Unicode строки
« Последнее редактирование: Ноябрь 25, 2010, 22:14 от Гурман » Записан

2^7-1 == 127, задумайтесь...
tim474
Гость
« Ответ #4 : Ноябрь 25, 2010, 22:15 »

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Ноябрь 25, 2010, 22:24 »

библиотека тут совершенно ни при чем, ее функции используются потом, надо для этого сформировать строку в текущем системном 8-и битном эквиваленте unicode-представления, поскольку работать она умеет только с 8-и битными символами

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

завтра проверю на Kubuntu 10.10 на обычной машине, правда там памяти очень мало, компиляция медленная из-за свопинга
« Последнее редактирование: Ноябрь 25, 2010, 22:39 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #6 : Ноябрь 25, 2010, 22:48 »

2 Гурман
А у тебя в main есть подобные строки:
QTextCodec::setCodecFor...
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Ноябрь 25, 2010, 22:57 »

а черт... и правда есть, другой программист main() писал больше года назад... спс, вопрос снят
Записан

2^7-1 == 127, задумайтесь...
deaks
Гость
« Ответ #8 : Ноябрь 26, 2010, 01:36 »

другой программист main() писал больше года назад
Веселый
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Ноябрь 26, 2010, 01:49 »

олол, покажите мне тот линупс, где кодировка не utf-8?
Даже винда вся из себя юникодовская внутрях, но все старательно используют убогие cp1251 и иже с ними
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Ноябрь 26, 2010, 06:29 »

>>поскольку utf8 не является 8-битной кодировкой.
а сколькиж она битная, если не 8-ми?
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Ноябрь 26, 2010, 10:09 »

Цитировать
Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode не определяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 23.