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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Проблема с записью в ini файл  (Прочитано 26037 раз)
prefetch
Гость
« : Декабрь 01, 2008, 11:59 »

Доброго времени суток.
Возникла проблема с записью кириллицы в ini файл с кодировкой Windows-1251.
Для записи в ini файл использую QSettings, версия Qt 4.4.3
Перепробывал различные варианты, но всегда получаю либо "???????" либо что-то вида
"\x34\x12\x43". Причем в одном из варантов записанная строка "\x34\x53\x23"
представляет собой коды кириллической строки в кодировке Windows-1251.
Английский текст записывается без проблем.
Кроме того, что интересно, если в ini файле есть кириллические строки, но я их не трогаю,
а изменяю другое поле, то они тоже перекодировываються в виде "\x34\x54".
Код:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QLineEdit* ModemName = new QLineEdit;
QSettings* ModemSet = new QSettings("config.txt", QSettings::IniFormat);
ModemName->setText(codec->toUnicode(ModemSet->value("ModemName", "").toByteArray())); //нормально считывает
/.../
ModemSet->setValue("ModemName", ModemName->text().toLocal8Bit().data()); //вот тут загвоздка
Записан
spirit
Гость
« Ответ #1 : Декабрь 01, 2008, 15:13 »

а вот так не пробовали сделать?
Код
C++ (Qt)
QTextCodec::setCodecForLocale(QTextCodec::codecForName("cp-1251"));
 
Записан
prefetch
Гость
« Ответ #2 : Декабрь 01, 2008, 15:41 »

а вот так не пробовали сделать?
Код
C++ (Qt)
QTextCodec::setCodecForLocale(QTextCodec::codecForName("cp-1251"));
 

Попробовал, никаких изменений. Все равно записывается в виде кодов "\x54\x23".  Грустный
Записан
spirit
Гость
« Ответ #3 : Декабрь 01, 2008, 15:44 »

а локаль какая?
Записан
BRE
Гость
« Ответ #4 : Декабрь 01, 2008, 15:58 »

Доброго времени суток.
Возникла проблема с записью кириллицы в ini файл с кодировкой Windows-1251.
Для записи в ini файл использую QSettings, версия Qt 4.4.3
Перепробывал различные варианты, но всегда получаю либо "НепонимающийНепонимающий?" либо что-то вида
"\x34\x12\x43". Причем в одном из варантов записанная строка "\x34\x53\x23"
представляет собой коды кириллической строки в кодировке Windows-1251.
Английский текст записывается без проблем.
Кроме того, что интересно, если в ini файле есть кириллические строки, но я их не трогаю,
а изменяю другое поле, то они тоже перекодировываються в виде "\x34\x54".
Код:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QLineEdit* ModemName = new QLineEdit;
QSettings* ModemSet = new QSettings("config.txt", QSettings::IniFormat);
ModemName->setText(codec->toUnicode(ModemSet->value("ModemName", "").toByteArray())); //нормально считывает
/.../
ModemSet->setValue("ModemName", ModemName->text().toLocal8Bit().data()); //вот тут загвоздка

Код:
ModemSet->setValue("ModemName", codec->fromUnicode( ModemName->text() ); 
Записан
prefetch
Гость
« Ответ #5 : Декабрь 01, 2008, 16:10 »

а локаль какая?
Системная стоит Windows-1251. Исходники тоже в ней.
В данный момент пишу программу под Windows XP SP3, Qt 4.4.3 + mingw (gcc 3.4.5).
Для tr установлен кодек по умолчанию windows-1251.
Еще пробывал передавать дополнительно параметр LANG=ru_RU.windows-1251, но это не помогло.
Записан
spirit
Гость
« Ответ #6 : Декабрь 01, 2008, 16:15 »

вот тут была такая же проблема

http://www.prog.org.ru/index.php?topic=7866.msg40748#msg40748

применение cp-1252 помогло.
Записан
prefetch
Гость
« Ответ #7 : Декабрь 01, 2008, 16:16 »

Код:
ModemSet->setValue("ModemName", codec->fromUnicode( ModemName->text() ); 

Все равно получаю свою шифровку "\x34\x53\x23".
Хотя, как я уже отмечал, записанные коды это кириллическая кодировка.
Записан
prefetch
Гость
« Ответ #8 : Декабрь 01, 2008, 16:21 »

вот тут была такая же проблема

http://www.prog.org.ru/index.php?topic=7866.msg40748#msg40748

применение cp-1252 помогло.

Да я читал ту тему. К сожалению в моем случае применение cp-1252 приводит к появлению "?????".
Хотя у меня и записывается в ini файл шифровка, но читается оттуда она программой нормально.
Проблема в том, что данный ini файл будет использоваться еще одной программой, а вот у нее возникнут проблемы.
Записан
spirit
Гость
« Ответ #9 : Декабрь 01, 2008, 16:32 »

а локаль точно русская, у меня просто анлийская и тест знаки вопроса валит, но должно работать.
сделайте тест, установите кодек для setCodecForCStrings cp-1251 и попробуйте в лоб записать русские символы в файл, типа такого
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-1251"));
QSettings settings("test.ini", QSettings::IniFormat);
settings.setValue("str1", "абвгд....");
settings.setValue("str2", "эюя...");
 
Записан
BRE
Гость
« Ответ #10 : Декабрь 01, 2008, 16:35 »

Хотя у меня и записывается в ini файл шифровка, но читается оттуда она программой нормально.
Какой шифровкой? Ты получаешь строку названия модема из элемента управления? Если да, то она передаеться в unicode. Строка в ini файле должна быть в кодировке CP-1251. Используем соответствующий кодек.

Запись в файл:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
QString modemName = editModemName->text();
ModemSet->setValue( "ModemName", codec->fromUnicode( modemName ) );

Чтение из файла:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
QString modemName = codec->toUnicode( ModemSet->value( "ModemName", "" ).toByteArray() );
editModemName->setText( modemName );

Если ты хочешь записать строку названия модема как константу и исходники программы у тебя в CP-1251, то записываешь не используя кодек:
Код:
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
ModemSet->setValue( "ModemName", "СуперМодем" ); // Эта строка и так в CP-1251.
« Последнее редактирование: Декабрь 01, 2008, 17:17 от BRE » Записан
prefetch
Гость
« Ответ #11 : Декабрь 01, 2008, 17:08 »

а локаль точно русская, у меня просто анлийская и тест знаки вопроса валит, но должно работать.
сделайте тест, установите кодек для setCodecForCStrings cp-1251 и попробуйте в лоб записать русские символы в файл, типа такого
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-1251"));
QSettings settings("test.ini", QSettings::IniFormat);
settings.setValue("str1", "абвгд....");
settings.setValue("str2", "эюя...");
 

Получается что-то вида:
Код:
str1=\x430\x431\x432\x433\x434....
str2=\x44d\x44e\x44f...

Может действительно что-то с локалью, QLocale::system().name() возвращает "ru_RU".
Записан
prefetch
Гость
« Ответ #12 : Декабрь 01, 2008, 17:20 »

Какой шифровкой? Ты получаешь строку названия модема из элемента управления? Если да, то она передаеться в unicode. Строка в ini файле должна быть в кодировке CP-1251. Используем соответствующий кодек.

Запись в файл:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
QString modemName = editModemName->text();
ModemSet->setValue( "ModemName", codec->fromUnicode( modemName ) );

Чтение из файла:
Код:
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
QString modemName = codec->toUnicode( ModemSet->value( "ModemName", "" ) );
editModemName->setText( modemName );

Если ты хочешь записать строку названия модема как константу и исходники программы у тебя в CP-1251, то записываешь не используя кодек:
Код:
QSettings *ModemSet = new QSettings("config.txt", QSettings::IniFormat);
ModemSet->setValue( "ModemName", "СуперМодем" ); // Эта строка и так в CP-1251.

Под шифровкой я подразумеваю, что записываются не символы кириллицы, а их цифровое представление вида "\x44". С записью и чтением файла, которые приведены я экспериментировал, но ничего не добился.
Под отладкой видно, что непосредственно до записи в кишках QSettings уже доходит что-то вида windows-1251 интерпретированная как Unicode, может где-то в недрах QVariant происходит необратимые изменения или какие-либо глобальные параметры влияют.
Записан
BRE
Гость
« Ответ #13 : Декабрь 01, 2008, 17:21 »

а локаль точно русская, у меня просто анлийская и тест знаки вопроса валит, но должно работать.
сделайте тест, установите кодек для setCodecForCStrings cp-1251 и попробуйте в лоб записать русские символы в файл, типа такого
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-1251"));
QSettings settings("test.ini", QSettings::IniFormat);
settings.setValue("str1", "абвгд....");
settings.setValue("str2", "эюя...");
 

Получается что-то вида:
Код:
str1=\x430\x431\x432\x433\x434....
str2=\x44d\x44e\x44f...

Может действительно что-то с локалью, QLocale::system().name() возвращает "ru_RU".
Попробуй тотже код, только не делай:
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-1251"));
Записан
BRE
Гость
« Ответ #14 : Декабрь 01, 2008, 17:24 »

может где-то в недрах QVariant происходит необратимые изменения или какие-либо глобальные параметры влияют.
Необратимые изменения это (цитата из Assistant):
Цитировать
QVariant::QVariant ( const char * val )
Constructs a new variant with a string value of val. The variant creates a deep copy of val, using the encoding set by QTextCodec::setCodecForCStrings().
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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