crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

kin63camapa
  опции профиля:
сообщение 9.12.2014, 18:41
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 21.8.2010
Пользователь №: 1976

Спасибо сказали: 0 раз(а)




Репутация:   1  


Столкнулся со странным поведением QSettings на юникоде, если файл в ascii все ok, cp1251 не детектит, но какбэ и не обязан. Но вот если файл в юникоде парсер делает вид что в файле пусто allKeys().size==0. Сначала думал что он bom не распознаёт, сделал костыль
Раскрывающийся текст

QString Parser::codecDetect(QString file)
{
    QFile fl(file);
    if (!fl.open(QFile::ReadOnly))
    {
        qDebug() << QString("Can not open file %1").arg(file));
        return "default";
    }
    QByteArray bom = fl.read(4);
    if ( bom.contains("\xEF\xBB\xBF")) return "UTF-8";
    //if ( bom.contains("\016\376\377")) return "SCSU";
    //if ( bom.contains("\335\163\146\163")) return "UTF-8-EBCDIC";
    if ( bom.contains("\376\377")) return "UTF-16BE";
    if ( bom.contains("\377\376")) return "UTF-16LE";
    return "Windows-1251";
}
//дальше по коду
    QSettings infoTxt(file,QSettings::IniFormat);
    QString codec = codecDetect(file);
    qDebug() << QString("Detect codec %1").arg(codec));
    infoTxt.setIniCodec(QTextCodec::codecForName(codec.toAscii()));


Костыль дал нормальную работу только на utf-8 на UTF-16LE и UTF-16BE QSettings говорит что нет никаких значений у тя в файле, иди лесом.
Думаю дай хоть гляну что ему нужно на вход подсовывать:
#include <QtCore>

int main(int argc, char *argv[])
{
    QSettings s("blah-blah.txt",QSettings::IniFormat);
    s.setIniCodec(QTextCodec::codecForName("UTF-16BE"));
    s.setValue("Test","Test");
    s.sync();

    QSettings b("blah-blah.txt",QSettings::IniFormat);
    b.setIniCodec(QTextCodec::codecForName("UTF-16BE"));
    qDebug() << b.value("Test").toString();
    return 0;
}

На выхлопе:
Запускается C:\tmp\test-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_______\release\test.exe...
Qt: Untested Windows version 6.2 detected!
"T?e?s?t" 
C:\tmp\test-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_______\release\test.exe завершился с кодом 0

Но и это ещё не все, в созданном файле вообще черт пойми какая кодировка притом без BOM
5B 47 65 6E 65 72 61 6C 5D 0D 0A 54 65 73 74 3D FE FF 00 54 FE FF 00 65 FE FF 00 73 FE FF 00 74 0D 0A

Собственно вопрос чо делать та?
зы и если кто знает как заставить QSettings работать с UTF-7, UTF-8-EBCDIC и SCSU поделитесь, о-о-о-очень надо

Сообщение отредактировал kin63camapa - 9.12.2014, 18:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 10.12.2014, 10:06
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


это совершенно нормально. потому что для параметров программист должен сам выбирать нужную ему кодировку. и вполне возможно, что параметры могут оказаться в разных кодировках. иначе будет ненужное ограничение для разработчиков.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 25.4.2025, 21:09