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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [4.3.1] QFtp - русские буквы (кодировки)  (Прочитано 9298 раз)
AlekSi
Гость
« : Сентябрь 27, 2007, 19:40 »

Сабж. Русские буквы в именах файлов и каталогов отображаются значками. При этом каталог меняет нормально.
В исходниках нашёл, что текст преобразуется fromLatin1. Как можно это вернуть обратно в нужную мне кодировку?
Записан
AlekSi
Гость
« Ответ #1 : Октябрь 02, 2007, 05:53 »

Есть C-строка в кодировке CP-1251. Она преобразуется в QString вызовом fromLatin1. Можно ли как-то вернуть её к первоначальному состоянию?
Или только qftp.cpp патчить?
Записан
Tonal
Гость
« Ответ #2 : Октябрь 02, 2007, 06:47 »

Можно самостоятельно команды на чтение каталога выдавать и разбирать.
Кстати, там ещё буква "я" может удваиваться: RFC 959
Записан
AlekSi
Гость
« Ответ #3 : Октябрь 02, 2007, 19:34 »

Команды подаются через управляющее соединение, а листинг выдаётся через другое. Доступа к последнему QFtp, само собой, не даёт.
Записан
AlekSi
Гость
« Ответ #4 : Октябрь 03, 2007, 20:53 »

В общем, QFtp я пропатчил, всё заработало.
Вообще же код этого класса - просто жесть.

Код:
--- qftp.h.ORIG	2007-08-07 17:08:51.000000000 +0400
+++ qftp.h 2007-10-02 21:02:53.000000000 +0400
@@ -42,6 +42,7 @@
 #include <QtCore/qstring.h>
 #include <QtNetwork/qurlinfo.h>
 #include <QtCore/qobject.h>
+#include <QtCore/qtextcodec.h>
 
 QT_BEGIN_HEADER
 
@@ -115,6 +116,8 @@
     int rmdir(const QString &dir);
     int rename(const QString &oldname, const QString &newname);
 
+    void setTextCodec(QTextCodec*);
+
     int rawCommand(const QString &command);
 
     qint64 bytesAvailable() const;

Код:
--- qftp.cpp.ORIG	2007-08-07 17:08:51.000000000 +0400
+++ qftp.cpp 2007-10-03 20:55:58.000000000 +0400
@@ -75,6 +75,8 @@
 
     QFtpDTP(QFtpPI *p, QObject *parent = 0);
 
+    QTextCodec *textCodec;
+
     void setData(QByteArray *);
     void setDevice(QIODevice *);
     void writeData();
@@ -95,7 +97,7 @@
 
     void abortConnection();
 
-    static bool parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info);
+    bool parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info);
 
 signals:
     void listInfo(const QUrlInfo&);
@@ -278,6 +280,7 @@
     pi(p),
     callWriteData(false)
 {
+    textCodec = QTextCodec::codecForName("latin1");
     clearData();
     listener.setObjectName(QLatin1String("QFtpDTP active state server"));
     connect(&listener, SIGNAL(newConnection()), SLOT(setupSocket()));
@@ -598,7 +601,7 @@
     if (buffer.isEmpty())
         return false;
 
-    QString bufferStr = QString::fromLatin1(buffer).trimmed();
+    QString bufferStr = textCodec->toUnicode(buffer).trimmed();
 
     // Unix style FTP servers
     QRegExp unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+"
@@ -2010,6 +2013,11 @@
     return d_func()->addCommand(new QFtpCommand(Rename, cmds));
 }
 
+void QFtp::setTextCodec(QTextCodec* codec)
+{
+    d_func()->pi.dtp.textCodec = codec;
+}
+
 /*!
     Sends the raw FTP command \a command to the FTP server. This is
     useful for low-level FTP access. If the operation you wish to
Записан
Tonal
Гость
« Ответ #5 : Октябрь 04, 2007, 07:28 »

Тролям закинул?
Записан
AlekSi
Гость
« Ответ #6 : Октябрь 04, 2007, 07:50 »

Ну само собой. Пока молчат.
Записан
AlekSi
Гость
« Ответ #7 : Октябрь 05, 2007, 19:17 »

Ответили на почту:
Цитировать
Thank you for your report and suggested patch. Is it really a violation
of the RFC, though? I thought FTP clients should take this into
consideration.(это я написал, что не-latin1 символы в именах являются нарушением RFC)

Anyway, our development team is aware of the issue, but do not have
resources to look into it at the moment. They have a task which is
scheduled for some future release, which in this case most likely means
that it will not be fixed until Qt 4.5 the earliest.

However, I have added your patch to the task so they can take it into
consideration.

For now, I am afraid my only suggestion is that you keep using the patch
you already created.

Kind regards,

Stian Thomassen, Support Engineer
Trolltech ASA, Norway
Что-то у них нередко ресурсов не хватает. Грустный
Записан
SLiDER
Гость
« Ответ #8 : Октябрь 05, 2007, 22:32 »

Что-то у них нередко ресурсов не хватает. Грустный

У них просто не принято дергать разработчиков с их текущих задач (в оличии от наших контор), что прописаны у них в плане работ, иначе нарушение сроков и полный бардак начинается, да и держать свободных разработчиков просто так, на всякий случай, тоже коммерчески невыгодно. То что не попадает в уже сверстанные планы должно подождать. Вам не повезло, видно в ближайших планах борьбы с ftp и rfc у них не было.  Подмигивающий
Записан
yshurik
Гость
« Ответ #9 : Октябрь 05, 2007, 23:58 »

fyi:
В свое время разбирался с подобным.
Не помню уже какой это был номер RFC но многие клиенты отправляют
серверу команду OPTS UTF8 ON для попытки, и по получении 200 работают с UTF8 строками.
Записан
AlekSi
Гость
« Ответ #10 : Октябрь 06, 2007, 07:02 »

RFC 2389 - Feature negotiation mechanism for the File Transfer Protocol
RFC 2640 - Internationalization of the File Transfer Protocol
Нужно будет пропатчить патч. Веселый
« Последнее редактирование: Октябрь 06, 2007, 07:28 от AlekSi » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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