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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не прикрепляет файл с русским именем  (Прочитано 9419 раз)
n2o
Гость
« : Май 07, 2011, 23:36 »

Пытаюсь отправить файл по e-mail:

Код:
QMessageService* m_service;
m_service = new QMessageService(this);   
QMessage message;
message.setType(QMessage::Email);
message.setTo(QMessageAddress(QMessageAddress::Email, "test@mail.ru"));

QString fn;
fn="имя файла";

QStringList file;
file << fn;
message.appendAttachments(file);
bool result=m_service->send(message);
Все файлы с английскими именами отправляет без проблем, а как только пытаюсь отправить с русским именем, то функция m_service->send() выдаёт false. И в телефоне появляется пустое сообщение без адресата и без файла.
Думал может проблема с кодировкой, но ведь в appendAttachments() можно только QString передать, а значит только UTF-8.

Может кто знает в чём дело?
Платформа s60 5th edition
Записан
ритт
Гость
« Ответ #1 : Май 08, 2011, 13:37 »

даю подсказку: QString  - это UTF-16
Записан
n2o
Гость
« Ответ #2 : Май 08, 2011, 14:17 »

даю подсказку: QString  - это UTF-16
это новость  Смеющийся

ну даже если так, то как мне передать в appendAttachments() строку в другой кодировке?
Записан
ритт
Гость
« Ответ #3 : Май 08, 2011, 15:09 »

даю подсказку: QString  - это UTF-16
это новость  Смеющийся
а документация по QString говорит об обратном.

ну даже если так, то как мне передать в appendAttachments() строку в другой кодировке?
десятки раз спрашивали уже. поиск по форуму поможет...
Записан
n2o
Гость
« Ответ #4 : Май 10, 2011, 16:54 »

десятки раз спрашивали уже. поиск по форуму поможет...

Извините, но ничего, что помогло бы, не нашёл.

Конечно можно в QByteArray записать в какой угодно кодировке, но ведь void QMessage::appendAttachments ( const QStringList & fileNames ) принимает только QStringList.

Может тут дело и не в кодировке?
Записан
shirushizo
Гость
« Ответ #5 : Май 10, 2011, 21:37 »

Еще одна подсказка - QTextCodec.
Если мысли не появились, то вбить QTextCodec в поиск по форуму.
Записан
ритт
Гость
« Ответ #6 : Май 10, 2011, 23:21 »

QTextCodec нужен только для перекодирования.

а если исходная строка в сорцах, то просто возьмите за правило не делать
Код:
QString fn;
fn="имя файла";
(либо же QTextCodec::setCodecForCStrings() - и геморойтесь с ним до конца дней своих...)
Записан
n2o
Гость
« Ответ #7 : Май 11, 2011, 08:46 »

Ещё уточню, что перед отправкой пробовал выводить имя файла на экран, выводилось нормально, но файл не прикрепляется.
Так же пробовал
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))
тоже безрезультатно.
Я так понимаю в QTextCodec::setCodecForCStrings() устанавливается кодировка для "сишных" строк, но в данном случае они нигде не используются, а по форуму везде только про это и пишут.

Строка не в сорцах, она получается в процессе работы программы
Код:
QString fn;
fn="имя файла";
как пример привёл.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Май 11, 2011, 09:04 »

Тогда приведи побольше кода.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
n2o
Гость
« Ответ #9 : Май 11, 2011, 09:24 »

Вот тут записывается имя файла в строку fn:
Код:
QFileDialog dialog(this);
dialog.setNameFilter( tr("Text Files (*.txt);;HTML (*.html *.htm);; All (*)"));
dialog.selectFilter(filt);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
dialog.setOptions(QFileDialog::DontUseNativeDialog);
QStringList fn1;
QString fn;
if (dialog.exec())
{
         fn1=dialog.selectedFiles();
         filt=dialog.selectedNameFilter();
    fn=fn1.back();
         }

Вот тут отправляется файл c именем fn на e-mail:
Код:
QMessageService* m_service;
m_service = new QMessageService(this);   
QMessage message;
message.setType(QMessage::Email);
message.setTo(QMessageAddress(QMessageAddress::Email, email)); //в email содержится адрес
QStringList file;
file << fn; //тот самый fn с именем файла
QMessageBox::warning(this, tr("E-mail"), file.back()); //тут вывожу на экран имя файла, выводит корректно
message.appendAttachments(file);
bool result=m_service->send(message); //если файл с русским именем то возвращает значение false
if(result==false)
{
QMessageBox::warning(this, tr("E-mail"), tr("Message could not be sent"));
         }
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #10 : Май 11, 2011, 17:02 »

А что это за класс QMessageService ?
Какая версия Qt?
Записан
n2o
Гость
« Ответ #11 : Май 11, 2011, 18:11 »

А что это за класс QMessageService ?
Какая версия Qt?
Это QtMobility
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #12 : Май 11, 2011, 19:15 »

Проверь результат возващаемый функцией error().

If a requested operation fails after being initiated then the error() function will return a value indicating the failure mode encountered.


QMessageManager::Error QMessageService::error () const

Returns a value indicating the last error condition encountered by the operation.


Записан
ритт
Гость
« Ответ #13 : Май 12, 2011, 00:04 »

с этого и надо было начинать, а то неделю сидим тут гадаем что не так с си-строками, которых на самом деле там и не было...(типа, в-нулевых)

во-первых, мобилити - кривая наколенная поделка (не вся, но по большей своей части). хотите водить с ней дружбу - запасайтесь терпением и временем на ковыряние сорцев.
во-вторых, какие ос, версия мобилити и системная кодировка?
в-третьих, выводит ли что-нибудь на консоль? в дэбаге запускать пробовали?
в-четвёртых, сдаётся мне, "QFileInfo fi(attachmentPath); _name = fi.fileName().toLatin1();" - это что-то как-то криво.

зы. если будет компилябельный экзампл, воспроизводящий проблему, могу полчасика уделить на ковыряние сорцев.
Записан
n2o
Гость
« Ответ #14 : Май 12, 2011, 10:05 »

Symbian OS 9.4, QtMobility 1.1.0, Symbian вроде как поддерживает UTF-16, а вот какие ещё не знаю, в инете не могу найти.

Цитировать
в-третьих, выводит ли что-нибудь на консоль? в дэбаге запускать пробовали?
к сожалению я так и не смог разобраться как пользоваться дебагером в Carbide.C++, на точки остановки не реагирует, и на консоль выводит не понятно что, а отладка на устройстве не работает по непонятным причинам.

Цитировать
в-четвёртых, сдаётся мне, "QFileInfo fi(attachmentPath); _name = fi.fileName().toLatin1();" - это что-то как-то криво.
это вы откуда взяли?

Цитировать
зы. если будет компилябельный экзампл, воспроизводящий проблему, могу полчасика уделить на ковыряние сорцев.
Ну даже если я состряпаю экзампл, вам же нужно будет устанавливать SDK со всеми нужными библиотеками, либо иметь устройство на котором имеются библиотеки qt и qtmobility.


error() возвращает
QMessageManager::RequestIncomplete   The operation failed to report successful completion, although no specific error was reported.
То есть не известно от чего не завершилось.

Сигнал stateChanged(QMessageService::State) посылает QMessageService::FinishedState, то есть операция завершена.


П.С. А QtMobility всё же придётся использовать, чтобы сохранить кросс-платформенность.
« Последнее редактирование: Май 12, 2011, 10:13 от n2o » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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