Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: insamo от Январь 19, 2011, 00:16



Название: QSettings и utf8
Отправлено: 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


Название: Re: QSettings и utf8
Отправлено: Blackwanderer от Январь 19, 2011, 06:47
В документации написано:
QString converts the const char * data into Unicode using the fromAscii() function.
У вас же, судя по всему, исходники в юникоде. Попробуйте так:
Код:
QString key = QString::fromUtf8("секция/ключ");


Название: Re: QSettings и utf8
Отправлено: insamo от Январь 19, 2011, 08:15
вывод в cats.ini

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

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


Название: Re: QSettings и utf8
Отправлено: merke от Январь 19, 2011, 08:17
QString key = QString::fromLocal8bit("секция/ключ");


Название: Re: QSettings и utf8
Отправлено: insamo от Январь 19, 2011, 08:47
не помогает, выводит тоже самое


Название: Re: QSettings и utf8
Отправлено: BRE от Январь 19, 2011, 08:53
http://www.prog.org.ru/topic_15983_0.html


Название: Re: QSettings и utf8
Отправлено: insamo от Январь 19, 2011, 08:57
чтение я реализовал, а вот запись увы нет, попросил же не тыкать на темы этого форума


Название: Re: QSettings и utf8
Отправлено: BRE от Январь 19, 2011, 09:23
чтение я реализовал, а вот запись увы нет, попросил же не тыкать на темы этого форума
::)
Ну что тут можно еще посоветовать....
Внимательно посмотри предложенную тему и пример.


Название: Re: QSettings и utf8
Отправлено: insamo от Январь 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;
}

сделал по подобию темы что ты мне посоветовал, все равно кракозябры


Название: Re: QSettings и utf8
Отправлено: Blackwanderer от Январь 19, 2011, 09:31
вывод в cats.ini

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

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

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


Название: Re: QSettings и utf8
Отправлено: BRE от Январь 19, 2011, 09:59
и судя по исходникам QSettings, так будут преобразовываться все не латинские ключи.
Можно попробовать сделать свои функции чтения/записи и зарегистрировать свой формат:
Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive ) [static]


Название: Re: QSettings и utf8
Отправлено: insamo от Январь 19, 2011, 10:04
буду пробовать, где то натыкался на гибрид QSetting и xml, но хотелось бы делать лишние телодвижения


Название: Re: QSettings и utf8
Отправлено: Янковский Александр от Октябрь 25, 2011, 11:18
буду пробовать, где то натыкался на гибрид QSetting и xml, но хотелось бы делать лишние телодвижения

insamo, есть результат?
Схожая ситуация и у меня.


Название: Re: QSettings и utf8
Отправлено: IMPOMEZIA от Октябрь 25, 2011, 14:49
Код:
void QSettings::setIniCodec ( const char * codecName )
В случае если версия Qt 4.5 или выше.


Название: Re: QSettings и utf8
Отправлено: Янковский Александр от Октябрь 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 );
}

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

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






Название: Re: QSettings и utf8
Отправлено: LisandreL от Октябрь 25, 2011, 18:56
Неа... Не работает...
Для результатов в QSettings работает.
Вопросы и багрепорты по QtJsonSettings лучше адресовать автору.