Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Руссие буквы в путях fopen() для Qt_5_3_MSVC2010


Автор: plica98 18.11.2016, 15:06
Добрый день уважаемые Qt-шники.

Приложение было написано под Linux и прекрасно работало, пока его не перенесли в Windows 7. Собственно и под Windows 7 все нормально работает, пока не используешь русские буквы в пути.
Приложение собрано  в Qt_5_3_MSVC2010.

Приложение скачивает файлы с удаленной машины и размещает их в папке с определенным именем. Так вот, если путь к этой папке не содержит русских букв, то все нормально. То есть, 

путь:  PREFIX = "c:/new box/"  - все нормально, 

путь: PREFIX = "c:/новая папка/"  - не воспринимается.

                    sprintf(l_buf,"%s%s",PREFIX,u);
                    opis = fopen(l_buf,"wb");

Может кто-нибудь уже сталкивался с этой проблемой?
Буду крайне признателен за помощь.

С уважением plica98.

Автор: maint 18.11.2016, 16:01
два варианта могёт быть. Текст, имя файла,  в программе в кодировке utf-8, а в файловой системе в cp-1251. Или наоборот. 

Автор: borisbn 18.11.2016, 16:20
Раз программа работала в Linux'е, то она написана в Utf-8. fopen требует в win1251. У меня была схожая проблема. Решается так:
Код

#include <QTextCodec>
#include <string>
#include <QString>

inline std::string utf8_2_win1251( const QString & str ) {
    QTextCodec * codec = QTextCodec::codecForName( "Windows-1251" );
    if ( ! codec )
    {
        return std::string();
    }
    return codec->fromUnicode( str ).toStdString();
}

inline QString win1251_2_utf8( const std::string & str ) {
    QTextCodec * codec = QTextCodec::codecForName( "Windows-1251" );
    if ( ! codec )
    {
        return QString();
    }
    return codec->toUnicode( str.c_str() );
}


Автор: Alca 18.11.2016, 16:20
А причем здесь Qt?

Автор: Alexeis 18.11.2016, 17:12
Цитата(Alca @  18.11.2016,  17:20 Найти цитируемый пост)
А причем здесь Qt? 

  При том, что MOC считает, что кодировка исходников совпадает с кодировкой строки, что верно только для GCC, но не для Visual Studio. Visual Studio если видит в исходниках символы в кодировке utf8 (при этом исходники с BOM), то конвертирует их в utf16, тогда как Qt считает, что там utf8. По размеру они тоже 2х байтные. Есть по меньшей мере 3 способа решения проблемы
1) Убрать BOM из исходников. Тогда VS думает, что это 1251 и не конвертирует uft8 в utf16
2) Использовать макрос QStringLiteral, насколько я понял, он превращает символы в однозначно трактуемые коды символов.
3) Использовать QOjbect::tr и кириллицу задавать только в файлах переводов.

Автор: plica98 21.11.2016, 08:31
Доброе утро, уважаемые Коллеги.

Большое спасибо maint, borisbn, Alexeis за оперативные отклики, внимание и советы.
Сейчас буду разбираться. Есть над чем поработать и задуматься.

С уважением и благодарностью plica98.

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