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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с кодировкой при считывании из QSettings в QString  (Прочитано 8873 раз)
lighting
Гость
« : Май 04, 2010, 16:16 »

Сохраняю некоторые строки в QSettings, по совету кого-то с этого форума для получения читаемого файла ini использую кодировку windows-1252. В файл пишется все нормально, но когда я считываю из из ini файла обратно в QString получаются какие-то кракозябли вида Êóëüøà Åâãåíèé Âàñèëüåâè÷.
Подскажите каким образом преобразовать их обратно к читаемому виду. Кусок кода, в котором данные считываются обратно вот:
Код
C++ (Qt)
const char* INI_CODEC_NAME = "windows-1252";
...
int QAddressBook::loadAddressbook()
{
   QSettings settings("addressbook.ini",QSettings::IniFormat);
   settings.setIniCodec(INI_CODEC_NAME);
   int ContactCount = settings.value("General/ContactCount").toInt();
   for (int i = 1; i <= ContactCount; i++)
   {
       settings.beginGroup("Contact"+QString::number(i));
       currentContact.setName(settings.value("Name").toString());
       ...
       settings.endGroup();
   }
   return 1;
}
 
« Последнее редактирование: Май 04, 2010, 16:22 от lighting » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 04, 2010, 16:21 »

Попробуй
currentContact.setName(settings.value("Name").toString().toLocal8Bit());
Записан

Qt 5.11/4.8.7 (X11/Win)
lighting
Гость
« Ответ #2 : Май 04, 2010, 16:27 »

не помогло, только кракозябли другими стали. toLatin1 также не помогло.
Записан
garryHotDog
Гость
« Ответ #3 : Май 04, 2010, 17:24 »

вот, должно помочь:
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
...
...
...
// чтение из ini
QString str=setting.value("group/paramName").toString();
 

и QSettings можно использовать без beginGroup:
Код
C++ (Qt)
       setting.setValue("group/paramName",ui.checkBox->isChecked());
 
« Последнее редактирование: Май 04, 2010, 17:43 от garryHotDog » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Май 04, 2010, 18:07 »

>>settings.setIniCodec(INI_CODEC_NAME);
попробуй установить явно QTextCodec, у меня работает

garryHotDog, установка кодеков, что ты привёл ни как не влияет на работу QSettings. Мало того кодек не правильный.
Записан

Юра.
garryHotDog
Гость
« Ответ #5 : Май 04, 2010, 18:09 »

Цитировать
установка кодеков, что ты привёл ни как не влияет на работу QSettings. Мало того кодек не правильный.
у меня работает на Xp,Vista,W7, Ubuntu, CentOS...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Май 04, 2010, 18:22 »

а ты кодировку файла сделай, как у автора поста - 1252 (не 1251) и проверь Подмигивающий
Записан

Юра.
garryHotDog
Гость
« Ответ #7 : Май 04, 2010, 18:50 »

ааа теперь понял, так может изначально лучше поставить 1251 и не парится!? Смеющийся
Записан
lighting
Гость
« Ответ #8 : Май 04, 2010, 22:08 »

Цитировать
попробуй установить явно QTextCodec, у меня работает
Вот так?
Код
C++ (Qt)
   QTextCodec *codec = QTextCodec::codecForName(INI_CODEC_NAME);
   settings.setIniCodec(codec);
 
У меня не заработало - никаких изменений я не заметил.
Цитировать
так может изначально лучше поставить 1251 и не парится!?
Оно конечно лучше, но вот в такой кодировке QSettings пишет ??????? вместо русских символов в Ini файл, а 1252 пишет вполне читаемый файл.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 04, 2010, 23:48 »

>>INI_CODEC_NAME = "windows-1252";
обрати внимание: ты пишешь с маленькой буквы. Может в этом причина?
Записан

Юра.
p166
Гость
« Ответ #10 : Май 05, 2010, 08:58 »

А может все таки "windows-1251"?
Записан
lighting
Гость
« Ответ #11 : Май 05, 2010, 10:49 »

мои извинения всем принявшим участие в этой теме - проблема была в том что когда-то давно я добавил строку
main.cpp
Код
C++ (Qt)
   QTextCodec *tc =QTextCodec::codecForName("Windows-1251");
   QTextCodec::setCodecForTr(tc);
 
с этим и были связаны проблемы при отображении. Теперь насущной осталась только проблема с QSettings, который не создает читаемые ini файлы в кодировке 1251.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Май 05, 2010, 12:00 »

так, давай сначала решим, в какой кодировке файл:
Windows-1251
или всё же
Windows-1252
?
Записан

Юра.
lighting
Гость
« Ответ #13 : Май 05, 2010, 13:59 »

еще раз мои извинения - проблемы с кодировкой в файле видимо так-же были вызваны тем что в main.cpp была выставлена другая кодировка. Во всяком случае сейчас в файл все также пишется нормально.
Записан
garryHotDog
Гость
« Ответ #14 : Май 05, 2010, 15:59 »

это называется магия Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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