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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: проблемы с кодировкой: wchar_t в QString  (Прочитано 13179 раз)
pichini
Гость
« : Апрель 18, 2012, 08:35 »

Всем привет!
Помогите разобраться. Делаю разбор html с кодировкой Windows-1251. Класс разбора писал не я, скачал отсюда (http://www.codeproject.com/Articles/14076/Fast-and-Compact-HTML-XML-Scanner-Tokenizer)
данные возвращаются в виде const wchar_t *. Перегоняю  в QString с помощью QString::fromWCharArray(). Русский текст не отображается, понимаю что надо перекодировать, но вот камим образом и в каком момент не могу разобраться. Все мои попытки использовать QTextCodec не приводят к нужному результату, наверное просто от нехватки знаний.
Записан
popper
Гость
« Ответ #1 : Апрель 18, 2012, 09:47 »

Без исходников многое непонятно, но попробуй так:
Код:
QString scannerResult(const wchar_t *str)
{
  QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
  size_t size = wcslen(str);
  return codec->toUnicode((const char*)str, size*2);
}
Записан
pichini
Гость
« Ответ #2 : Апрель 18, 2012, 10:12 »

Не работает. Русские буквы конечно появились, но не то, что надо.
Попробую привести код:

методы для получения данных (проблема с методом get_value(), когда русские буквы):

Код
C++ (Qt)
...
typedef wchar_t wchar;
...
   const wchar*    get_value();
 
   // get attribute name
   const char*     get_attr_name();
 
   // get tag name
   const char*     get_tag_name();
 
 

Код получения данных:

Код
C++ (Qt)
struct str_istream: public markup::instream
{
 const char* p;
 const char* end;
 
 str_istream(const char* src): p(src), end(src + strlen(src)) {}
 virtual wchar_t get_char() { return p < end? *p++: 0; }
};
 
....
 
          QByteArray htmlData = htmlFile.readAll();
 
           str_istream si(htmlData);
           markup::scanner sc(si);
 
           bool useEOF = false;
           while(true)
           {
             int t = sc.get_token();
             switch(t)
             {
               case markup::scanner::TT_ERROR:
                 qDebug() << "ERROR";
                 break;
               case markup::scanner::TT_EOF:
                   useEOF = true;
                 qDebug() <<  "EOF";
                 break;
               case markup::scanner::TT_TAG_START:
                 qDebug() <<  "TAG START:" << sc.get_tag_name();
                 break;
               case markup::scanner::TT_TAG_END:
                 qDebug() <<  "TAG END:" << sc.get_tag_name();
                 break;
               case markup::scanner::TT_ATTR:
                 qDebug() <<  QString("\tATTR:%1 = %2").arg(sc.get_attr_name()).arg(QString::fromWCharArray(sc.get_value()));
                 break;
               case markup::scanner::TT_WORD:
               case markup::scanner::TT_SPACE:
                   QString str1 = QString::fromWCharArray(sc.get_value());
                   qDebug() << "value:" << str1;
                 break;
             }
             if (useEOF)
                 break;
           }
 

Может данные надо перекодировать во что-то до передачи их классу обработки? Можно и сам код класса подправить при необходимости, вопрос что и где?
Записан
pichini
Гость
« Ответ #3 : Апрель 18, 2012, 10:25 »

Забыл уточнить, qDebug() << "русские буквы" выводит корректно

на main добавил:

    QTextCodec   *codec1 = QTextCodec::codecForName("CP-1251");
    QTextCodec::setCodecForTr(codec1);
    QTextCodec::setCodecForLocale(codec1);
    QTextCodec::setCodecForCStrings(codec1);
Записан
popper
Гость
« Ответ #4 : Апрель 18, 2012, 10:42 »

А фрагмент html файла можешь показать?
Записан
pichini
Гость
« Ответ #5 : Апрель 18, 2012, 11:10 »

Конечно, даже весь не жалко.
« Последнее редактирование: Апрель 18, 2012, 15:20 от pichini » Записан
popper
Гость
« Ответ #6 : Апрель 18, 2012, 11:42 »

В html вроде все верно. Кидай минимальный компилируемый проект
Записан
pichini
Гость
« Ответ #7 : Апрель 18, 2012, 12:01 »

Работаю под Win7 в QTCreator
QT 4.7.4

Убрал все свои игрища с QTextCodec.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Апрель 18, 2012, 14:30 »

креатор в дебаггере символ "А" показывает как "\177700", а в студии строка "«А+» —" отображается в дебаггере как
Код:
value
0x003bc060 "ᆱ￀+ᄏᅠラ"
    [0]: 65451 L'ᆱ'
    [1]: 65472 L'￀'
    [2]: 43 L'+'
    [3]: 65467 L'ᄏ'
    [4]: 65440 L'ᅠ'
    [5]: 65431 L'ラ'
    [6]: 0
хотя студия показывает корректный текст в htmlData.

включение/отключение кодировок не помогает. по-моему что-то тут нечисто с парсером.
« Последнее редактирование: Апрель 18, 2012, 14:32 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
V1KT0P
Гость
« Ответ #9 : Апрель 18, 2012, 14:57 »

креатор в дебаггере символ "А" показывает как "\177700", а в студии строка "«А+» —" отображается в дебаггере как
Код:
value
0x003bc060 "ᆱ￀+ᄏᅠラ"
    [0]: 65451 L'ᆱ'
    [1]: 65472 L'￀'
    [2]: 43 L'+'
    [3]: 65467 L'ᄏ'
    [4]: 65440 L'ᅠ'
    [5]: 65431 L'ラ'
    [6]: 0
хотя студия показывает корректный текст в htmlData.

включение/отключение кодировок не помогает. по-моему что-то тут нечисто с парсером.
Да он там что-то с wchar намудрил. Я заменил все на wchar-ы на char и все заработало, русские символы нормально отображаются. Он тупо не задумываясь из одного char делает один wchar надеясь непонятно на что надеясь. На что он вообще рассчитывал и что бы он делал попадись ему текст в UTF8?
Записан
pichini
Гость
« Ответ #10 : Апрель 18, 2012, 15:20 »

Цитировать
Да он там что-то с wchar намудрил. Я заменил все на wchar-ы на char и все заработало, русские символы нормально отображаются. Он тупо не задумываясь из одного char делает один wchar надеясь непонятно на что надеясь. На что он вообще рассчитывал и что бы он делал попадись ему текст в UTF8?

Это вы про автора парсера или про меня Улыбающийся?
« Последнее редактирование: Апрель 18, 2012, 15:22 от pichini » Записан
V1KT0P
Гость
« Ответ #11 : Апрель 18, 2012, 15:33 »

Цитировать
Да он там что-то с wchar намудрил. Я заменил все на wchar-ы на char и все заработало, русские символы нормально отображаются. Он тупо не задумываясь из одного char делает один wchar надеясь непонятно на что надеясь. На что он вообще рассчитывал и что бы он делал попадись ему текст в UTF8?

Это вы про автора парсера или про меня Улыбающийся?

Тому кто сие безобразие написал =).
Записан
pichini
Гость
« Ответ #12 : Апрель 18, 2012, 15:40 »

Если безобразие в моем коде (dialog.cpp), то подскажите что не так, я новичек, мне, так сказать, простительно. Если же безобразие в парсере (xh_scanner.cpp), то нужен совет, стоит ли его использовать (дописав и исправив что-то) или отказаться от него.
Работа планируется только под виндой, но html, теоретически, может быть любая.
« Последнее редактирование: Апрель 18, 2012, 15:41 от pichini » Записан
pichini
Гость
« Ответ #13 : Апрель 18, 2012, 15:47 »

Вот тут кстати оговорочка от автора, которая, возможно, многое объясняет:

Цитировать
In Closing

The given scanner does not address any input stream encoding problems. XML and HTML are dealt with differently with this. A general idea for the cases where you don't know the input encoding up front: your input stream should be smart enough to be able to switch the encoding of the input on the fly. The given scanner was initially created as part of the HTMLayout SDK: a lightweight embeddable HTML rendering component.
Записан
V1KT0P
Гость
« Ответ #14 : Апрель 18, 2012, 15:52 »

Если безобразие в моем коде (dialog.cpp), то подскажите что не так, я новичек, мне, так сказать, простительно. Если же безобразие в парсере (xh_scanner.cpp), то нужен совет, стоит ли его использовать (дописав и исправив что-то) или отказаться от него.
Работа планируется только под виндой, но html, теоретически, может быть любая.
Замени wchar-ы на обычнве char-ы ибо все-равно этот сканер не преобразовывает UTF8 в юникод, а значит ничего хорошего от этого не будет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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