Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Кодировки имен файлов + QTextCodec |
Автор: Mal Hack 17.7.2009, 00:37 | ||
Доброе. Пару дней назад столкнулся с казалось бы банальной проблемой, которую, правда, упорно решал два дня. Суть была такова. QFile, ровно как и QDir не находили (если передавать имя директории строкой в setPath к примеру) папок, которые реально существовали на диске. Первое что пришло в голову, что "мешаюся" русские буквы. Не правда. Это отрабатывалось при toLocal8bit или toLatin. Второе предполодение - пробелы. Тоже не правда. Оказалась причина в том, что в программе генерировалась строка x0X, где вместо X вставлялась цифра через QSring().setNum. В результате вот этой папки программа и не видела. НО. если я занова переименовывал папку в системе (Win XP Sp3), но она становилась видимой. В общем, после долгих мутарств по мануалам и инету проблему решил следующим образом:
и использованием toLocal8Bit. Вопрос собственно вот в чем. В какой кодировке в винде создаются имена папок и файлов? Понятно, что UTF8 тут отменяется совершенно. Второй момент, уже непосредственно к кути. Проясните, правильно ли я понимаю, что setCodecForCStrings устанавливает кодек для ВСЕХ строк которые я юзаю как объекты QString? И чем тогда он отличается от setCodecForLocale? Едем дальше в Волгоград ![]() Спасибо. |
Автор: anil 18.8.2009, 21:26 |
Имена папок в винде создаются в вин-1251, просто QString об этом не знает и tr, from(to)Local8Bit, toLatin etc по опыту не очень помогают) так что кодировку чаще всего приходится сообщать объекту QString используя TextCodec. setCodecForCStrings действительно устанавливает кодек для всех QString, const char * и QByteArray, которые его видят. Если нужно, можно, как и в случае с "неработающим" tr, установить "родную" кодировку в main.cpp. setCodecForTr делает это соответственно для tr. setCodecForLocale как утверждает http://doc.trolltech.com/4.2/qtextcodec.html#setCodecForLocale применяется в приложениях, которые сами устанавливают механизм применения локали. кстати, по поводу переносимости на разные локали - вот что http://doc.trolltech.com/4.2/i18n.html сами тролли. |