Russian Qt Forum

Qt => Работа с сетью => Тема начата: Aleksey_Zh от Апрель 13, 2010, 07:48



Название: [Решено]проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 07:48
Система - SDK2009.02 mingw windows статическая сборка. Делаю ftp соединение и считываю имена файлов. Английские имена отображаются корректно. Русские - абракадабра.

Чтобы избавиться от данного трабла ввел код
Код:
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QTextCodec::setCodecForTr( codec );
    QTextCodec::setCodecForCStrings( codec );
    QTextCodec::setCodecForLocale( codec );

Пытался менять кодировку на cp1251 - история та же.
Не помогло. Что делать?

З.Ы. получение списка файлов содрал из стандартного примера (\examples\network\ftp)

З.З.Ы.
Код:
void MainWindow::addToList(const QUrlInfo &urlInfo)
{
    QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
    QString OUT = codec->fromUnicode(urlInfo.name());
}
Сие шаманство тоже не привело к желаемому результату!
Щас начну в панику впадать  :-\ :)



Название: Re: проблема с именами файлов(кодировкой)
Отправлено: shirushizo от Апрель 13, 2010, 10:06
Попробуй вместо fileName написать tr(fileName) при выводе, хотя я не уверен что поможет.
Еще попробуй, где считываешь, fromAnsii() использовать, или кодеки на utf-8,koi8 поменяй.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: p166 от Апрель 13, 2010, 10:38
    QTextCodec::setCodecForTr( codec );
    QTextCodec::setCodecForCStrings( codec );
    QTextCodec::setCodecForLocale( codec );
и делай через tr("...")
или tr(QString::fromUtf8(...))
Пользуюсь и в linux и в windows, проблемы с кодировкой исчезли.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: crossly от Апрель 13, 2010, 10:58
Цитировать
и делай через tr("...")
вы что имена файлов переводит собрались??


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 11:04
QTextCodec::setCodecForTr( codec );
//    QTextCodec::setCodecForCStrings( codec );
//    QTextCodec::setCodecForLocale( codec );


Действительно так.
MainWin->trUtf8(urlInfo.name().toAscii());
Это поправило положение.
Но появилась другая проблема - теперь без tr - никуда. Если раньше можно было печатать текст и не заморачиваться - теперь его нужно обязательно tr-ить. Можно это как - то обойти?


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 11:23
Цитировать
QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
    QString OUT = codec->fromUnicode(urlInfo.name());

Похоже что ftp сервер не на Qt написан.
Тогда почему QString OUT = codec->fromUnicode(urlInfo.name());
а не QString OUT = codec->toUnicode(...);

??


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: BOBO4KA от Апрель 13, 2010, 11:24
Код:
fileName.toLatin1()

попробуй


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 11:37
toUnicode - пробовал. Сервер - filezilla. Написан на vc
toLatin1 - тоже не прошло


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 11:46
Выясни в какой кодировке сервер пересылает данные.
Это может быть кодировка операционки, под которой крутится сервер.
Тогда выясни, что там. Может это вообще CP866 ?
Потом
QTextCodec *codec=QTextCodec::codecForName( Кодировка );
QString OUT = codec->toUnicode(...);




Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 11:50
Вообще сервак локальный - на моей машине (с виндой). Так что кодировка по умолчанию скорее всего родная -windows-1251.
Вообще как можно точно выяснить 1. текущую кодировку 2. серверную (в которой он шлет данные)?


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 11:55
Куда выводишь имена файлов?
Где абракадабру видишь ? В виджете, в консоли, ...?


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 12:02
Изначально - в QTreeWidget. Далее, для отладки стал использовать простой QString для накопления данных. - Для отображения соответственно QMessageBox.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 12:06
Цитировать
Действительно так.
MainWin->trUtf8(urlInfo.name().toAscii());
Это поправило положение.

Похоже данные приходят в UTF-8;
codecForName("UTF-8") или QString::fromUtf8() должно помочь.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: BRE от Апрель 13, 2010, 12:09
2 Aleksey_Zh. Гадать не надо.  :)
Посмотри RFC: http://tools.ietf.org/html/rfc2640


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 13:07
QString::fromUtf8() должно помочь.
пробовал так QString::fromUtf8(urlInfo.name().toAscii());
не помогает.


P.S. Хотя нет, помогает. Но помогает при полностью отключенном в main кодеке.
Тогда встает вопрос - как при включенном QTextCodec (включение описано в первом сообщении) сделать рабочий код? Без tr.

P.P.S. Похоже все - таки так как хотелось не сделаешь. То, что данные приходят в UTF-8 - это определенно. А вот с дальнейшим преобразованием используя код в main - особо не порыпаешься.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 13:31
 Я вообще не понимаю этой логики

QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr( codec );
MainWin->trUtf8(urlInfo.name().toAscii());
РАБОТАЕТ


QString::fromUtf8(urlInfo.name().toAscii());
НЕ работает

Ну и как же, вашу мать, это надо понимать?


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: ufna от Апрель 13, 2010, 14:23
ну дак ты кодек то для чего задал? Для tr, а не QString.

Код
C++ (Qt)
// Sets right codec for russian words
   QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 14:25
ну дак ты кодек то для чего задал? Для tr, а не QString.

Код
C++ (Qt)
// Sets right codec for russian words
   QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
А это разве не для QString???????????????????????


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 14:27
Я вообще не понимаю этой логики

QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr( codec );
MainWin->trUtf8(urlInfo.name().toAscii());
РАБОТАЕТ


QString::fromUtf8(urlInfo.name().toAscii());
НЕ работает

Ну и как же, вашу мать, это надо понимать?

у меня такое ощущение, что задавая
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
происходит двойное перекодирование. Если не прав - поправьте.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: BRE от Апрель 13, 2010, 14:37
Камрады, может лучше один раз разобраться с тем, что делают эти функции, чем использовать их как магическую последовательность команд, главное кодек подобрать....  ;)
Ну столько раз уже поднималась эта тема... Вторая по популярности после: Почему на другой машине не открывается БД/не читаются картинки.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 14:45
Причём тут кодеки?

trUtf8() и fromUtf8() предполагают, что на входе текст в "UTF-8"

trUtf8() это не tr(). Ей должно быть абсолютно пофигу какой там setCodecForTr() !

И если автор темы пишет, что trUtf8() работает, а fromUtf8() НЕ работает - то я уже не знаю чему верить.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 13, 2010, 14:53
Причём тут кодеки?

trUtf8() и fromUtf8() предполагают, что на входе текст в "UTF-8"

trUtf8() это не tr(). Ей должно быть абсолютно пофигу какой там setCodecForTr() !

И если автор темы пишет, что trUtf8() работает, а fromUtf8() НЕ работает - то я уже не знаю чему верить.

Zmeishe, читайте внимательнее.

Цитировать
QTextCodec::setCodecForTr( codec );
//    QTextCodec::setCodecForCStrings( codec );
//    QTextCodec::setCodecForLocale( codec );


Действительно так.
MainWin->trUtf8(urlInfo.name().toAscii());
Это поправило положение.
trUtf8 работает только в том случае когда закомментировано //    QTextCodec::setCodecForCStrings( codec );
//    QTextCodec::setCodecForLocale( codec );


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: BRE от Апрель 13, 2010, 14:57
Вот-вот, можно долго гадать...
Но все таки проще один раз разобраться, как это все работает:

Цитировать
QByteArray QString::toAscii () const

Returns an 8-bit ASCII representation of the string as a QByteArray.

If a codec has been set using QTextCodec::setCodecForCStrings(), it is used to convert Unicode to 8-bit char; otherwise this function does the same as toLatin1().

See also fromAscii(), toLatin1(), toUtf8(), toLocal8Bit(), and QTextCodec.


Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Zmeishe от Апрель 13, 2010, 15:01
MainWin->trUtf8(urlInfo.name().toAscii());
будет работать, когда urlInfo.name().toAscii() вернёт строку в utf8.

Вы хотите сказать что

QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr( codec );


превращает строку urlInfo.name().toAscii() в utf8 ?




Название: Re: проблема с именами файлов(кодировкой)
Отправлено: BRE от Апрель 13, 2010, 15:04
MainWin->trUtf8(urlInfo.name().toAscii());
будет работать, когда urlInfo.name().toAscii() вернёт строку в utf8.

Вы хотите сказать что

QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr( codec );


превращает строку urlInfo.name().toAscii() в utf8 ?
Это кому вопрос?

Нужно сесть и внимательно посмотреть сколько и каких преобразований строки происходит при выполнении этого кода:
Код
C++ (Qt)
MainWin->trUtf8(urlInfo.name().toAscii());



Название: Re: проблема с именами файлов(кодировкой)
Отправлено: Aleksey_Zh от Апрель 14, 2010, 08:08
Все, для меня проблема решена. Нужно было просто внимательно посмотреть на то, что делает toAscii. Битва самоваров закончена. Спасибо BRE!!!  :)