Russian Qt Forum
Сентябрь 21, 2024, 14:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile::copy() - проблема с русскими именами [РЕШЕНО]  (Прочитано 11054 раз)
24pm
Гость
« : Март 28, 2009, 15:38 »

QFile::copy(fileName, newFileName) отрабатывает нормально если в пути нет русских букв!
Qt 4.5, Windows XP.
Подскажите куда смотреть, пожалуйста!

« Последнее редактирование: Апрель 09, 2009, 03:21 от 24pm » Записан
igor_bogomolov
Гость
« Ответ #1 : Март 28, 2009, 16:06 »

Смотреть в сторону QTextCodec.

Код
C++ (Qt)
QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));
QFile file(tr("..."));
bool ok = file.copy(tr("......"));
Записан
24pm
Гость
« Ответ #2 : Апрель 07, 2009, 02:23 »

Что-то не помогает. Пробовал и
Код
C++ (Qt)
QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));
QString fnFrom = tr( qPrintable(fullFN) );
QString fnTo = tr( qPrintable(newFN) );
if ( QFile::copy(fnFrom, fnTo) ) {...
 
И явно
Код
C++ (Qt)
QString fnFrom = tr("D:/Русский/test.log");
QString fnTo = tr("D:/test.log");
 
Куда ещё глянуть?
« Последнее редактирование: Апрель 07, 2009, 02:27 от 24pm » Записан
igor_bogomolov
Гость
« Ответ #3 : Апрель 07, 2009, 08:41 »

Все туда же. Читайте описание класса QTextCodec. То что я написал, это всего лишь пример. Установите требуемую кодировку. Скорее всего "Windows - 1251".
И пользуемся поиском.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Апрель 07, 2009, 10:03 »

2 24pm,
Для случая когда ты строковую константу оборачиваешь в функцию tr() кодек ставь такой же, какая кодировка у тебя в файле с исходником.

А переменные в функцию tr() оборачивать незачем.
« Последнее редактирование: Апрель 07, 2009, 10:05 от lit-uriy » Записан

Юра.
24pm
Гость
« Ответ #5 : Апрель 07, 2009, 11:05 »

Описание QTextCodec читал, там сказано, что кодировка "System" принимает значение системной кодировки (в моём случает windows-1251).
Кодировка исходников UTF-8. Если переменные не заворачивать в tr(), то копирование не работает.
Имеет ли смысл заменить "System" на UTF-8? Попробую...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Апрель 07, 2009, 11:08 »

2 24pm, "Если переменные не заворачивать в tr(), то копирование не работает."
глянь тему: QProcess не открывает русские файлы
в плане использования переменной содержащей путь к файлу
Записан

Юра.
24pm
Гость
« Ответ #7 : Апрель 07, 2009, 16:38 »

Вариант
Код
C++ (Qt)
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QFile f(tr("D:/Русский/text.txt"));
bool ok = f.copy(tr("D:/newfile.txt"));
работает, но не могу добиться работы, если имя файла в переменной. Пробовал
Код
C++ (Qt)
QFile f(fnFrom.toLocal8Bit());
QFile f(fnFrom.toLocal8Bit().constData());
 
Если указываю
Код
C++ (Qt)
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QString fnFrom = tr( qPrintable(fullFN) );
и сохраняю переменную в файл, то туда она записывается в кодировке windows-1251, но копировать всё равно не хочет.
Что ещё можно предпринять?

P.S. ссылку на QProcess я прочесть успел (там советовали использовать toLocal8Bit()), но сейчас она не действует.
Записан
24pm
Гость
« Ответ #8 : Апрель 09, 2009, 03:21 »

Итак, рабочий код:
Код
C++ (Qt)
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QString fnFrom = tr( qPrintable(fullFN) );
QString fnTo = tr( qPrintable(imgNewFN) );
if ( QFile::copy(fnFrom, fnTo) ) {
...
 
Кодировка исходников utf-8, системная windows-1251.
Однако, код не хотел работать из-за того, что один из подключаемых файлов был в кодировке windows-1251, что удалось обнаружить не сразу!

Большое спасибо всем отозвавшимся!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.183 секунд. Запросов: 23.