Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Гурман от Апрель 28, 2015, 16:30



Название: (РЕШЕНО) Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 16:30
Есть атрибут, который формируется из статической char* строки, для сохранения получаю его для QDomElement::setAttribute через tr(). В XML-файл записывается нормальная читаемая строка. При восстановлении в программе отображаются вопросительные знаки. Но если на месте этого атрибута в текстовом редакторе перебить по-русски, то восстанавливается нормальный текст. Я так понимаю, в файл записывается кодировка windows-1251, поскольку tr() в ней выдаёт. Но её почему-то xmldoc.setContent( &file ); не восстанавливает, хотя Locale задан. А если я в редакторе перебиваю, там получается UTF-8, и оно восстанавливается нормально. Но сохранять в UTF-8 нельзя, поскольку взаимодействует с программами, которые в файле требуют 8-и битную кодировку.

В настройках приложения задано:
Код:
    QTextCodec::setCodecForTr(QTextCodec::codecForName( "windows-1251"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName( "windows-1251"));

Где поправить, чтобы в xmldoc.setContent( &file ) с кодировками всё было однозначно, и можно было задавать такую же кодировку, как у tr()? Дальше не только windows-1251 потребуются. И надо еще при этом не сбить сохренение настроек в виде QSettings, он строки сам в виде QByteArray записывает, существенно не сбить ему кодировки.

Чехарда с кодировками в Qt уже подзае... нет бы сделать одну установку на всё приложение, и чтобы везде всё было гомогенно.

ЗЫ добавлял в начало документа
Код:
QDomNode xmlNode = xmldoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"charset-1251\"")
не влияет.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Bepec от Апрель 28, 2015, 17:39
tr возвращает QString, т.е. UTF16.
Кодек для tr указывается для преобразования строки tr() в QString, нне?

Как вы сохраняете файл? а как восстанавливаете?

PS много слов, мало фактов. Достаточно было б "не восстанавливается, сохраняю вот так (код), восстанавливаю вот так (код)".


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 18:03
tr возвращает QString, т.е. UTF16.
Кодек для tr указывается для преобразования строки tr() в QString, нне?

Как вы сохраняете файл? а как восстанавливаете?

PS много слов, мало фактов. Достаточно было б "не восстанавливается, сохраняю вот так (код), восстанавливаю вот так (код)".

С кодеком для tr() всё в порядке.

Сохраняю через QTextStream

Код:
        QTextStream( &file ) << xmldoc.toString();

сохраняется всё, как хотелось. Восстанавливается кодировка не как надо. Загрузка простая:

Код:
    if( file.open( QIODevice::ReadOnly ) )
    {
        xmldoc.setContent( &file );
        file.close();
    }

ну и далее разбор загруженного в xmldoc.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Bepec от Апрель 28, 2015, 18:09
Ну тут я вижу слабое место - QTextStream, у которого кодировка может не совпадать и скорее всего так и есть.

PS сделайте проще, сохраняйте сразу в файл, без стрима.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 18:13
Ну тут я вижу слабое место - QTextStream, у которого кодировка может не совпадать и скорее всего так и есть.

PS сделайте проще, сохраняйте сразу в файл, без стрима.

Там проблемы нет. В файле та кодировка, которая нужна.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Bepec от Апрель 28, 2015, 18:16
Прикрепите пример проекта, я его помучаю тогда.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 18:19
О, это возиться надо, проект создавать с нуля... Весь свой проект я дать не могу.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Bepec от Апрель 28, 2015, 18:21
Ну тогда пусть другие отвечают :)


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 18:37
Я же всегда спрашиваю в надежде, что уже решал кто-то, чтобы экономить свое и чужое время.

Беда тут:
Код:
    QString objname = interface.attribute( "objname" );

где interface - это
Код:
QDomElement interface = node.toElement();
полученный из QDomNode node, который child у QDomDocument. То есть, стандартная DOM-структура, но как-то не требовалось ранее в неё атрибуты с русскими буквами записывать. И в этой objname вместо русских хронически получаю вопросительные знаки при чтении атрибутов в кодировке 1251.  :-\ Больше нигде проблем с кодировками нет.


Название: Re: Что управляет кодировками в QDomDocument?
Отправлено: Гурман от Апрель 28, 2015, 18:48
Тфу шайтан... ошибка в строке указания кодировки в XML. Должно быть
Цитировать
<?xml version="1.0" encoding="windows-1251"?>
а я генерил
Цитировать
<?xml version="1.0" encoding="charset-1251"?>
пепел мне на голову.