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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSettings и utf8  (Прочитано 15885 раз)
insamo
Гость
« : Январь 19, 2011, 00:16 »

Код:
#include <QSettings>
#include <QDebug>
#include <QStringList>
#include <QTextCodec>
#include <QObject>

int main(int argc, char **argv)
{


    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

    QSettings set(app.applicationDirPath()+"/programs/cats.ini",QSettings::IniFormat);
    set.setIniCodec(codec);
    QString key = "секция/ключ";
    QVariant value = "валуе";

    set.setValue(key,value);

}


setValue(key,value) - первый параметр пишется крякозябрами а второй нормально, гуру помогите пожалуйста, все уже перерыл, на другие темы этого форума не тыкать, все просотрел

ОСЬ winXP, qt 4.7.1
Записан
Blackwanderer
Гость
« Ответ #1 : Январь 19, 2011, 06:47 »

В документации написано:
QString converts the const char * data into Unicode using the fromAscii() function.
У вас же, судя по всему, исходники в юникоде. Попробуйте так:
Код:
QString key = QString::fromUtf8("секция/ключ");
Записан
insamo
Гость
« Ответ #2 : Январь 19, 2011, 08:15 »

вывод в cats.ini

[%U0441%U0435%U043A%U0446%U0438%U044F]
%U043A%U043B%U044E%U0447=валуе

Исходники все в utf-8 без bom, ini файл тоже в utf-8
Записан
merke
Гость
« Ответ #3 : Январь 19, 2011, 08:17 »

QString key = QString::fromLocal8bit("секция/ключ");
Записан
insamo
Гость
« Ответ #4 : Январь 19, 2011, 08:47 »

не помогает, выводит тоже самое
Записан
BRE
Гость
« Ответ #5 : Январь 19, 2011, 08:53 »

http://www.prog.org.ru/topic_15983_0.html
Записан
insamo
Гость
« Ответ #6 : Январь 19, 2011, 08:57 »

чтение я реализовал, а вот запись увы нет, попросил же не тыкать на темы этого форума
Записан
BRE
Гость
« Ответ #7 : Январь 19, 2011, 09:23 »

чтение я реализовал, а вот запись увы нет, попросил же не тыкать на темы этого форума
Строит глазки
Ну что тут можно еще посоветовать....
Внимательно посмотри предложенную тему и пример.
Записан
insamo
Гость
« Ответ #8 : Январь 19, 2011, 09:28 »

Код:
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QSettings>
#include <QDebug>

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);

 QTextCodec *codec = QTextCodec::codecForName("Windows-1251");

 QSettings ini(qApp->applicationDirPath()+"/programs/cats.ini",QSettings::IniFormat);
 ini.setIniCodec( codec );


 ini.beginGroup(codec->toUnicode("группа"));
 ini.setValue(codec->toUnicode("ключ"),codec->toUnicode("валуя"));
 ini.endGroup();

 return 0;
}

сделал по подобию темы что ты мне посоветовал, все равно кракозябры
Записан
Blackwanderer
Гость
« Ответ #9 : Январь 19, 2011, 09:31 »

вывод в cats.ini

[%U0441%U0435%U043A%U0446%U0438%U044F]
%U043A%U043B%U044E%U0447=валуе

Исходники все в utf-8 без bom, ini файл тоже в utf-8

Это не кракозябры, а запись юникода кодами символов в явном виде. И это скорее не баг, а фича.
Записан
BRE
Гость
« Ответ #10 : Январь 19, 2011, 09:59 »

и судя по исходникам QSettings, так будут преобразовываться все не латинские ключи.
Можно попробовать сделать свои функции чтения/записи и зарегистрировать свой формат:
Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive ) [static]
Записан
insamo
Гость
« Ответ #11 : Январь 19, 2011, 10:04 »

буду пробовать, где то натыкался на гибрид QSetting и xml, но хотелось бы делать лишние телодвижения
Записан
Янковский Александр
Гость
« Ответ #12 : Октябрь 25, 2011, 11:18 »

буду пробовать, где то натыкался на гибрид QSetting и xml, но хотелось бы делать лишние телодвижения

insamo, есть результат?
Схожая ситуация и у меня.
Записан
IMPOMEZIA
Гость
« Ответ #13 : Октябрь 25, 2011, 14:49 »

Код:
void QSettings::setIniCodec ( const char * codecName )
В случае если версия Qt 4.5 или выше.
Записан
Янковский Александр
Гость
« Ответ #14 : Октябрь 25, 2011, 15:49 »

Код:
void QSettings::setIniCodec ( const char * codecName )
В случае если версия Qt 4.5 или выше.

Неа... Не работает...

Ситуация следующая.
Захотел иметь в программе конфиги в "читабельном" виде, но и в то  же время хорошо структурированном.
XML прикручивать не захотел, очень велика вероятность ошибки разбора структуры документа при одной небольшой ошибке в синтаксисе.
Приглянулась здесь статическая библиотека с классом, реализующим QSettings в формате JSON - очень читабельный формат, структурированный, поддерживается вложенность и т.п.!
Сама прога трудится в OpenSUSE 11.4 соответственно с Qt версии 4.7.4.

Имя ключа всегда на английском языке, значения могут быть на русском.

Вот кусок кода...
Код:
        QtJsonSettings::setIniCodec( "UTF-8" );
QString section_test = tr( "SECTION/TEST" );

QString section_1 = section_test + tr( "/NUMBER_1" );
QString section_2 = section_test + tr( "/NUMBER_2" );

QString value_rus = tr( "Значение" );
QString value_en = tr( "Value" );

QtJsonSettings::setValue( section_1, value_en );
QtJsonSettings::setValue( section_2, value_rus );

QtJsonSettings::sync();


А вот результат выполнения кода (файл конфигурации):
Цитировать
{
    "SECTION":
    {
        "TEST":
        {
            "NUMBER_1":"Value",
            "NUMBER_2":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435"
        }
    }
}

Вот такие вот параметры выставляются до запуска основного цикла приложения
Код:
        QTextCodec* codec = QTextCodec::codecForName( "UTF-8" );

if ( codec != 0 )
{
QTextCodec::setCodecForCStrings( codec );
QTextCodec::setCodecForLocale( codec );
QTextCodec::setCodecForTr( codec );
}

Вот собственно и тема для размышлений...

Как сделать, чтобы читабельными были русские символы в конфиге?




Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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