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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Что управляет кодировками в QDomDocument?  (Прочитано 8439 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 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\"")
не влияет.
« Последнее редактирование: Апрель 28, 2015, 18:48 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #1 : Апрель 28, 2015, 17:39 »

tr возвращает QString, т.е. UTF16.
Кодек для tr указывается для преобразования строки tr() в QString, нне?

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

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Апрель 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.
« Последнее редактирование: Апрель 28, 2015, 18:05 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #3 : Апрель 28, 2015, 18:09 »

Ну тут я вижу слабое место - QTextStream, у которого кодировка может не совпадать и скорее всего так и есть.

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Апрель 28, 2015, 18:13 »

Ну тут я вижу слабое место - QTextStream, у которого кодировка может не совпадать и скорее всего так и есть.

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

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #5 : Апрель 28, 2015, 18:16 »

Прикрепите пример проекта, я его помучаю тогда.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Апрель 28, 2015, 18:19 »

О, это возиться надо, проект создавать с нуля... Весь свой проект я дать не могу.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #7 : Апрель 28, 2015, 18:21 »

Ну тогда пусть другие отвечают Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Апрель 28, 2015, 18:37 »

Я же всегда спрашиваю в надежде, что уже решал кто-то, чтобы экономить свое и чужое время.

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

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Апрель 28, 2015, 18:48 »

Тфу шайтан... ошибка в строке указания кодировки в XML. Должно быть
Цитировать
<?xml version="1.0" encoding="windows-1251"?>
а я генерил
Цитировать
<?xml version="1.0" encoding="charset-1251"?>
пепел мне на голову.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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