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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 9.12.2014, 20:07
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Меня реализация QSettings бесит давно и основательно.
Всё что нужно было сделать это конструктор:
QSettings ( const QIODevice & iodevice, QObject * parent = 0 )
вместо
QSettings ( const QString & fileName, Format format, QObject * parent = 0 )

тогда мы могли бы читать файл в QBuffer предварительно преобразовав кодировку (но внутрянка получается сложнее, поэтому делать так троли не стали).

Выход из положения - зарегистрировать свой формат, через
registerFormat()

по сути создаёшь две функции, чтения и записи из/в файла и регистрируешь их связывая с условным форматом.
В функция чтения/записи реализуешь механизм перекодирования.
В общем-то не сложно и можно эту кухню вынести в отдельную пару .cpp/.h

Сообщение отредактировал Litkevich Yuriy - 9.12.2014, 20:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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


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