2012-03-16 2 views
1

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

Строка - это путь к файлу, в котором некоторые из каталогов имеют имена в 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, передавая символ * в ofstream конструктор работает отлично, однако, использование QFile гораздо предпочтительнее, так как приложение в QT.

+0

Быстрый вопрос ... Вы уверены, что определенный путь существует? Если вы используете QFile, тогда каталог, в котором вы хотите создать файл, ДОЛЖЕН существовать –

+0

Также что говорит об ошибкеString() в QFile? –

+0

Да, проблема где-то с кодировкой. Я изменил код, чтобы он создавал файл с не-unicode именем в текущем каталоге (имя файла жестко запрограммировано), а символы не-Unicode просто исчезают из имени: в коде и файле, который был «test1.txt» был вызван просто «1.txt». В имени каталога отсутствовала часть, отличная от юникода, что делает путь несуществующим. – Daniel

ответ

2

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

0

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

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

+0

Языковой стандарт определенно KOI8-R. Я фактически переношу код с qt3 на qt4, а в версии qt3 он отлично работает с fromLocal8Bit, я только что проверил. – Daniel

Смежные вопросы