Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Кодировки имен файлов + QTextCodec


Автор: Mal Hack 17.7.2009, 00:37
Доброе.

Пару дней назад столкнулся с казалось бы банальной проблемой, которую, правда, упорно решал два дня.
Суть была такова. QFile, ровно как и QDir не находили (если передавать имя директории строкой в setPath к примеру) папок, которые реально существовали на диске.
Первое что пришло в голову, что "мешаюся" русские буквы. Не правда. Это отрабатывалось при toLocal8bit или toLatin. Второе предполодение - пробелы. Тоже не правда. Оказалась причина в том, что в программе генерировалась строка x0X, где вместо X вставлялась цифра через QSring().setNum. В результате вот этой папки программа и не видела. НО. если я  занова переименовывал папку в системе (Win XP Sp3), но она становилась видимой. В общем, после долгих мутарств по мануалам и инету проблему решил следующим образом:
Код

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

и использованием toLocal8Bit.

Вопрос собственно вот в чем. В какой кодировке в винде создаются имена папок и файлов? Понятно, что UTF8 тут отменяется совершенно. Второй момент, уже непосредственно к кути. Проясните, правильно ли я понимаю, что setCodecForCStrings устанавливает кодек для ВСЕХ строк которые я юзаю как объекты QString? И чем тогда он отличается от setCodecForLocale?


Едем дальше в Волгоград smile...  Если я хочу, чтобы мое приложение работало на любой локализации ОС WinXP, я должен в настройках проги определят местную локаль и устанавливать соответствующий кодек?

Спасибо.

Автор: 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 сами тролли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)