В моей программе пользователь может указать имя файла в командной строке или использовать QFileDialog
. В первом случае у меня есть char*
без какой-либо информации о кодировании, во второй у меня есть QString
.Сохранять символы non-ascii между std :: string и QString
Чтобы сохранить имя файла для последующего использования (последние файлы), мне нужно это как QString
. Но чтобы открыть файл с std::ifstream
, мне нужен std::string
.
Теперь начинается веселье. Я могу сделать:
filename = QString::fromLocal8Bit(argv[1]);
позже, я могу сделать:
std::string fn = filename.toLocal8Bit().constData();
Это работает для большинства персонажей, но не все. Например, слово Раиса будет выглядеть одинаково после прохождения этого преобразования, но на самом деле они имеют разные символы. Итак, пока у меня может быть Раиса.txt, и он отобразит Раиса.txt, он не найдет файл в файловой системе. Большинство писем работает, но и не делает. (Обратите внимание, что он работает правильно, когда файл был выбран в QFileDialog
. Это не когда она возникла из командной строки.)
Есть ли лучший способ сохранить имя файла? Прямо сейчас я получаю его в любой родной кодировке и могу проходить в одной кодировке, не зная об этом. По крайней мере, я подумал.
Зачем использовать ifstream для открытия файла вместо QFile? – TheDarkKnight
Файл открывается в другом модуле, который не имеет зависимостей Qt. Он отделен от GUI. – ypnos
Почему вы используете QString :: fromLocal8Bit? Из документации этой функции говорится следующее: «QTextCodec :: codecForLocale() используется для выполнения преобразования из Unicode. Если кодировка локали не может быть определена, эта функция выполняет то же самое, что и дляLatin1().«Похоже, в вашем случае toLatin1(), наконец, вызывается, и когда вы позже вызываете toLocal8Bit(), происходит следующее:« Если эта строка содержит любые символы, которые не могут быть закодированы в локали, возвращаемый массив байтов не определен. Эти символы могут быть подавлены или заменены другим. » –