Название: QTextCodec Windows-1251 Отправлено: BuRn от Март 08, 2015, 16:35 Есть html страница, в ней явно указано "charset=windows-1251". Пытаюсь преобразовать в utf8 QString, на выходе получаю лажу, выглядит это как-то
Код: QTextCodec* defaultTextCodec = QTextCodec::codecForName("Windows-1251"); Код: QString page = QTextCodec::codecForName("Windows-1251")->toUnicode(_page.toLatin1()); Название: Re: QTextCodec Windows-1251 Отправлено: Bepec от Март 08, 2015, 17:55 зачем вы constData применяете? Вот в упор не вижу необходимости )
Название: Re: QTextCodec Windows-1251 Отправлено: kambala от Март 08, 2015, 18:49 1. toLatin1() убьет всю кириллицу, используй toLocal8Bit() например или через кодек
2. QString — это UTF-16, а не 8 Название: Re: QTextCodec Windows-1251 Отправлено: BuRn от Март 08, 2015, 19:02 1. toLatin1() убьет всю кириллицу, используй toLocal8Bit() например или через кодек Опять делаю что-то не так? но в строках по прежнему лажа2. QString — это UTF-16, а не 8 Код: QTextCodec* defaultTextCodec = QTextCodec::codecForName("Windows-1251"); Название: Re: QTextCodec Windows-1251 Отправлено: Old от Март 08, 2015, 19:08 _page это QString или QByteArray?
Откуда и как она заполняется? Название: Re: QTextCodec Windows-1251 Отправлено: BuRn от Март 08, 2015, 19:16 _page это QString или QByteArray? _page - QString, строка которая получилась из QByteArray в результате запроса get от NetworkAccessManagerОткуда и как она заполняется? QString content(pReply->readAll()); pReply - QNetworkReply Название: Re: QTextCodec Windows-1251 Отправлено: Old от Март 08, 2015, 19:26 _page - QString, строка которая получилась из QByteArray в результате запроса get от NetworkAccessManager Вот не надо таких преобразований. :)QString content(pReply->readAll()); pReply - QNetworkReply Вам нужно два кодека, один W-1251, второй UTF-8. Вначале, вы делаете QByteArray toUnicode с кодеком W-1251, получаете QString. Дальше вы делаете этой строке fromUnicode с кодеком UTF-8, получаете QByteArray в которой данные в utf8. Название: Re: QTextCodec Windows-1251 Отправлено: BuRn от Март 08, 2015, 19:37 _page - QString, строка которая получилась из QByteArray в результате запроса get от NetworkAccessManager Вот не надо таких преобразований. :)QString content(pReply->readAll()); pReply - QNetworkReply Вам нужно два кодека, один W-1251, второй UTF-8. Вначале, вы делаете QByteArray toUnicode с кодеком W-1251, получаете QString. Дальше вы делаете этой строке fromUnicode с кодеком UTF-8, получаете QByteArray в которой данные в utf8. Название: Re: QTextCodec Windows-1251 Отправлено: Old от Март 08, 2015, 19:49 Т.е. в моем случае придется декодировать дважды ? Если средствами кодеков Qt, то да.Кодеки умеют конвертировать из указанной кодировки в юникод и обратно. Название: Re: QTextCodec Windows-1251 Отправлено: sociopath от Март 10, 2015, 11:08 Никогда не используйте неявное приведение QByteArray к QString для не ascii-символов (кириллицы и пр.). В Qt4 это преобразование делается через функцию fromAscii, которая в свою очередь использует либо QTextCodec::codecForCStrings, либо Latin1. В Qt5 это преобразование делается через функцию fromUtf8.
Всегда следует явно указывать кодировку, в которую хотите привести массив байтов. Результат pReply->readAll() в виде QByteArray нужно тащить до момента, когда известен кодек, и уже тогда декодировать в QString (если кодек известен при pReply->readAll(), значит сразу после этого и декодировать). Делать что-то типа: Код: QByteArray ba = pReply->readAll(); Название: Re: QTextCodec Windows-1251 Отправлено: BuRn от Март 10, 2015, 11:57 Никогда не используйте неявное приведение QByteArray к QString для не ascii-символов (кириллицы и пр.). В Qt4 это преобразование делается через функцию fromAscii, которая в свою очередь использует либо QTextCodec::codecForCStrings, либо Latin1. В Qt5 это преобразование делается через функцию fromUtf8. Не, сделал по другому, это класс используется вообщем для получения web страницы, а страницы бывают в разных кодировках, ваш вариант тоже от части не корректен. Сделал через codecForHtml, проверил на нескольких сайтах с разными кодировками, определяет корректно Всегда следует явно указывать кодировку, в которую хотите привести массив байтов. Результат pReply->readAll() в виде QByteArray нужно тащить до момента, когда известен кодек, и уже тогда декодировать в QString (если кодек известен при pReply->readAll(), значит сразу после этого и декодировать). Делать что-то типа: Код: QByteArray ba = pReply->readAll(); Название: Re: QTextCodec Windows-1251 Отправлено: sociopath от Март 10, 2015, 12:57 Если используете Qt5, то скорее всего codecForHtml правильно определит кодировку:
Код: QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) А вот в Qt4.8 очень слабенькая реализация (HTML5 стандарт определения кодировки не поддерживает): Код: QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) Если используете Qt4, очень советую вставить реализацию из Qt5. |