Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Руссие буквы в путях fopen() для Qt_5_3_MSVC2010, Руссие буквы в путях fopen() для Qt_5_3_ 
:(
    Опции темы
plica98
Дата 18.11.2016, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Добрый день уважаемые 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.


Это сообщение отредактировал(а) plica98 - 18.11.2016, 15:08
PM MAIL   Вверх
maint
Дата 18.11.2016, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



два варианта могёт быть. Текст, имя файла,  в программе в кодировке utf-8, а в файловой системе в cp-1251. Или наоборот. 
PM   Вверх
borisbn
Дата 18.11.2016, 16:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Раз программа работала в 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() );
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alca
Дата 18.11.2016, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



А причем здесь Qt?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 18.11.2016, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 1
Всего: 459



Цитата(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 и кириллицу задавать только в файлах переводов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
plica98
Дата 21.11.2016, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Доброе утро, уважаемые Коллеги.

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1215 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.