Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: pichini от Апрель 18, 2012, 08:35



Название: проблемы с кодировкой: wchar_t в QString
Отправлено: 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 не приводят к нужному результату, наверное просто от нехватки знаний.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: popper от Апрель 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);
}


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 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;
           }
 

Может данные надо перекодировать во что-то до передачи их классу обработки? Можно и сам код класса подправить при необходимости, вопрос что и где?


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 18, 2012, 10:25
Забыл уточнить, qDebug() << "русские буквы" выводит корректно

на main добавил:

    QTextCodec   *codec1 = QTextCodec::codecForName("CP-1251");
    QTextCodec::setCodecForTr(codec1);
    QTextCodec::setCodecForLocale(codec1);
    QTextCodec::setCodecForCStrings(codec1);


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: popper от Апрель 18, 2012, 10:42
А фрагмент html файла можешь показать?


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 18, 2012, 11:10
Конечно, даже весь не жалко.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: popper от Апрель 18, 2012, 11:42
В html вроде все верно. Кидай минимальный компилируемый проект


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 18, 2012, 12:01
Работаю под Win7 в QTCreator
QT 4.7.4

Убрал все свои игрища с QTextCodec.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: kambala от Апрель 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.

включение/отключение кодировок не помогает. по-моему что-то тут нечисто с парсером.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: V1KT0P от Апрель 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?


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 18, 2012, 15:20
Цитировать
Да он там что-то с wchar намудрил. Я заменил все на wchar-ы на char и все заработало, русские символы нормально отображаются. Он тупо не задумываясь из одного char делает один wchar надеясь непонятно на что надеясь. На что он вообще рассчитывал и что бы он делал попадись ему текст в UTF8?

Это вы про автора парсера или про меня :)?


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: V1KT0P от Апрель 18, 2012, 15:33
Цитировать
Да он там что-то с wchar намудрил. Я заменил все на wchar-ы на char и все заработало, русские символы нормально отображаются. Он тупо не задумываясь из одного char делает один wchar надеясь непонятно на что надеясь. На что он вообще рассчитывал и что бы он делал попадись ему текст в UTF8?

Это вы про автора парсера или про меня :)?

Тому кто сие безобразие написал =).


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 18, 2012, 15:40
Если безобразие в моем коде (dialog.cpp), то подскажите что не так, я новичек, мне, так сказать, простительно. Если же безобразие в парсере (xh_scanner.cpp), то нужен совет, стоит ли его использовать (дописав и исправив что-то) или отказаться от него.
Работа планируется только под виндой, но html, теоретически, может быть любая.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: pichini от Апрель 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.


Название: Re: проблемы с кодировкой: wchar_t в QString
Отправлено: V1KT0P от Апрель 18, 2012, 15:52
Если безобразие в моем коде (dialog.cpp), то подскажите что не так, я новичек, мне, так сказать, простительно. Если же безобразие в парсере (xh_scanner.cpp), то нужен совет, стоит ли его использовать (дописав и исправив что-то) или отказаться от него.
Работа планируется только под виндой, но html, теоретически, может быть любая.
Замени wchar-ы на обычнве char-ы ибо все-равно этот сканер не преобразовывает UTF8 в юникод, а значит ничего хорошего от этого не будет.