Создание QFile с не-юникодным именем - PullRequest
1 голос
/ 16 марта 2012

У меня есть строка в кодировке KOI8-R, она передается как argv, поэтому изначально это объект char *. К сожалению, использование этой устаревшей кодировки на данном этапе невозможно. Системный языковой стандарт - KOI8-R, и исходный код также находится в этой кодировке.

Строка - это путь к файлу, в котором некоторые каталоги имеют имена в KOI8-R. Мне нужно открыть файл для записи с использованием QFile. Однако open () всегда возвращает false независимо от того, что я пытаюсь.

Мне нужно преобразовать путь в QString, чтобы передать его конструктору QFile, однако простое преобразование, QString :: fromLocal8Bit () и QFile :: decodeName (), похоже, не помогает.

char* filename; // This is a KOI8-R string
QFile f(QString::fromLocal8Bit(filename));
// QFile f(QFile::decodeName(filename)) doesn't work too
f.open(QIODevice::WriteOnly | QIODevice::Text); // returns false

Единственный способ заставить его работать, это с помощью объектов ofstream из STL, передача char * конструктору ofstream работает нормально, однако использование QFile гораздо предпочтительнее, так как приложение находится в QT.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Решением этой проблемы было добавление инициализации QApplication (QApplication a (argc, argv);) ДО выполнения каких-либо действий со строками.Очевидно, инициализация локали находится где-то глубоко внутри конструктора QApplication.

0 голосов
/ 16 марта 2012

Вы уверены, что система использует локаль с кодировкой KOI8-R? Qt использует кодировку локали по умолчанию для доступа к файлам, поэтому, если это, например, что-то, использующее UTF-8, он не сможет открыть файл с именем в KOI8-R.

Если локаль отличается, вы должны иметь возможность создать пользовательскую функцию кодирования (например, используя QTextCodec), чтобы переопределить ее, и установить QFile, чтобы использовать ее, используя QFile::setEncodingFunction() .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...