Название: [Решено]проблема с именами файлов(кодировкой) Отправлено: Aleksey_Zh от Апрель 13, 2010, 07:48 Система - SDK2009.02 mingw windows статическая сборка. Делаю ftp соединение и считываю имена файлов. Английские имена отображаются корректно. Русские - абракадабра.
Чтобы избавиться от данного трабла ввел код Код: QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); Пытался менять кодировку на cp1251 - история та же. Не помогло. Что делать? З.Ы. получение списка файлов содрал из стандартного примера (\examples\network\ftp) З.З.Ы. Код: void MainWindow::addToList(const QUrlInfo &urlInfo) Щас начну в панику впадать :-\ :) Название: Re: проблема с именами файлов(кодировкой) Отправлено: shirushizo от Апрель 13, 2010, 10:06 Попробуй вместо fileName написать tr(fileName) при выводе, хотя я не уверен что поможет.
Еще попробуй, где считываешь, fromAnsii() использовать, или кодеки на utf-8,koi8 поменяй. Название: Re: проблема с именами файлов(кодировкой) Отправлено: p166 от Апрель 13, 2010, 10:38 QTextCodec::setCodecForTr( 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.
Код
Название: Re: проблема с именами файлов(кодировкой) Отправлено: Aleksey_Zh от Апрель 13, 2010, 14:25 ну дак ты кодек то для чего задал? Для tr, а не QString. Код
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 ); trUtf8 работает только в том случае когда закомментировано // QTextCodec::setCodecForCStrings( codec );// QTextCodec::setCodecForCStrings( codec ); // QTextCodec::setCodecForLocale( codec ); Действительно так. MainWin->trUtf8(urlInfo.name().toAscii()); Это поправило положение. // 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 ? Нужно сесть и внимательно посмотреть сколько и каких преобразований строки происходит при выполнении этого кода: Код
Название: Re: проблема с именами файлов(кодировкой) Отправлено: Aleksey_Zh от Апрель 14, 2010, 08:08 Все, для меня проблема решена. Нужно было просто внимательно посмотреть на то, что делает toAscii. Битва самоваров закончена. Спасибо BRE!!! :)
|