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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.6 /4.7 - Кодировки  (Прочитано 7614 раз)
RankoR
Гость
« : Июнь 11, 2010, 21:33 »

Здравствуйте! Пишу класс для работы с протоколом OSCAR, столкнулся с проблемой определения кодировки - то, что работает под Линуксом - не работает под виндой, и наоборот, + некоторые клиенты отправляют сообщения вообще непонятно в какой кодировке.
Вопрос, я думаю, очевиден - есть ли какой-то (надежный, желательно) метод определения кодировки системы и некоторого текста?
Записан
pashazz
Гость
« Ответ #1 : Июнь 11, 2010, 21:38 »

Интересно, зачем класс для работы с проприетарной асечкой? http://github.com/holycheater/qt-icq-transport/
Записан
pashazz
Гость
« Ответ #2 : Июнь 11, 2010, 21:47 »

А вообще...
Код
C++ (Qt)
QString codec;
#ifdef Q_WS_WIN
switch (QLocale::language)
{
case QLocale::Russian
codec="CP1251"
.....
}
#else
//see LANG env.
QStringList lang = QProcessEnvironment::systemEnvironment().value("LANG").split('.', QString::SkipEmptyParts);
if (lang.count() > 1)
 codec = lang.at(1).toUpper; //или toLower
#endif
 
 

прошу прощения за неточности.
Записан
RankoR
Гость
« Ответ #3 : Июнь 11, 2010, 21:50 »

Для написания юзабельного ICQ-клиента (не хочу холиварить, но под линукс пока ни одного не видел. qutIM в каком-то зачаточном состоянии, Pidgin жутко не удобный, субъективно, конечно). Плюс имею доступ к приватной информации о протоколе в виде друга, который уже несколько лет занимается его реверсингом.
Ну это не так важно, в принципе, вопрос остается тот же.
Записан
RankoR
Гость
« Ответ #4 : Июнь 11, 2010, 21:51 »

Спасибо, сейчас попробую. Только проблема все-таки решена не полностью - как определить кодировку текста, хранящегося в QByteArray?
Записан
pashazz
Гость
« Ответ #5 : Июнь 11, 2010, 22:18 »

Для написания юзабельного ICQ-клиента (не хочу холиварить, но под линукс пока ни одного не видел. qutIM в каком-то зачаточном состоянии, Pidgin жутко не удобный, субъективно, конечно). Плюс имею доступ к приватной информации о протоколе в виде друга, который уже несколько лет занимается его реверсингом.
Ну это не так важно, в принципе, вопрос остается тот же.

Эм, а вы QutIM 0.3 trunk пробовали? И еще, ваш клиент будет открытым?
Записан
RankoR
Гость
« Ответ #6 : Июнь 11, 2010, 22:29 »

Конечно будет. Пробовал, не очень понравилось. Опять же, чисто субъективно (негативное мнение сложилось еще после просмотра исходников версии 0.2)
Записан
Sancho_s_rancho
Гость
« Ответ #7 : Июнь 11, 2010, 23:46 »

Спасибо, сейчас попробую. Только проблема все-таки решена не полностью - как определить кодировку текста, хранящегося в QByteArray?
В общем случае - никак.
пи.си. Я-то наивный думал что во всяких icq юникод какой-то используется.
Записан
RankoR
Гость
« Ответ #8 : Июнь 12, 2010, 10:13 »

пи.си. Я-то наивный думал что во всяких icq юникод какой-то используется.
Да там "кто во что горазд". С QIP и оф. клиентом все ок, а Jimm присылает в хрен-пойми-какой кодировке.
P.S. Если у меня системная кодировка Windows-1251, к примеру, а текст - в UTF-16, то мне нужно делать так?
Код:
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
qDebug() << codec->fromUnicode(textString);

или toUnicode()? я путаюсь постоянно в этом.
Записан
Sancho_s_rancho
Гость
« Ответ #9 : Июнь 12, 2010, 10:55 »

Кодировка виндовс тут вообще не при чем. Как я понял вам надо пришедший текст (массив байтов) перекодировать в QString.
Вы знаете (или сильно предполагаете), что такой-то клиент присылает в таком-то юникоде, а такой-то клиент в однобайтовой кодировке windows-1251.
У вас есть массив байтов QByteArray ba, полученный от клиента:
Код:
QTextCodec *codec;
QString str; //строка, с которой вы будете работать дальше в Qt
if  (client==urod)
{
codec = QTextCodec::codecForName("Windows-1251");
}
else if (client==utf8_lover)
{
codec = QTextCodec::codecForName("utf-8");
}
else
{
//такого клиента я не знаю, пусть пользователь выберет кодировку вручную
}
str = codec->toUnicode(ba);
еще может быть вариант что в другой программе пользователь сам может выбирать кодировку(скорее всего, т.к. навряд ли испанец или немец захочет писать на кириллице). Существует ли такое на практике я не знаю, т.к. говноаськой ни разу не пользовался.
« Последнее редактирование: Июнь 12, 2010, 11:00 от Sancho_s_rancho » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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