Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: svalkadoma от Ноябрь 04, 2010, 00:48



Название: Перевод русского текста QString в char *
Отправлено: svalkadoma от Ноябрь 04, 2010, 00:48
Добрый день всем.

Столкнулся с проблемой. Имеется функция сторонней библиотеки в которую следует передать "char *". Имеется файл на диске. Задача в том, что следует получить имя файла, затем преобразовать его в char * чтобы передать в функцию.

Отражу все данные, какие могу.
Мой исходный код хранится в кодировке UTF-8.
В main() у меня:
Код:
QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );
QTextCodec::setCodecForCStrings ( QTextCodec::codecForName ( "UTF-8" ) );
QTextCodec::setCodecForTr ( QTextCodec::codecForName ( "UTF-8" ) );

а в моём cpp-файле выполняется следующее:
Код:
QString dir("D:/МУЗА");
QDir d;
d.setFilter(QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);
d.setSorting(QDir::Name);

QFileInfoList files = d.entryInfoList();
for(int i = 0; i < files.size(); ++i)
{
       //  тут я попытался получить имя текущего файла в списке и перевести это имя в char *
       qDebug() << QString(dir+"/"+files.at(i).fileName()).toAscii().data();
       qDebug() << QString(dir+"/"+files.at(i).fileName()).toLatin1().data();
       qDebug() << QString(dir+"/"+files.at(i).fileName()).toUtf8().data();
       qDebug() << QString(dir+"/"+files.at(i).fileName()).toLocal8Bit().data();
       TagLib::FileRef f(QString(dir+"/"+files.at(i).fileName()).toLocal8Bit().data());
}

на первой же итерации происходит сегфолт после полной итерации.
вот вывод:

D:/МУЗА/Alexei Aigi/929/01 Алексей Айги - Несколько возможностей использования квази-цитат.mp3

D:/????/Alexei Aigi/929/01 ??????? ???? - ????????? ???????????? ????????????? ?????-?????.mp3

D:/МУЗА/Alexei Aigi/929/01 Алексей Айги - Несколько возможностей использования квази-цитат.mp3

D:/МУЗА/Alexei Aigi/929/01 Алексей Айги - Несколько возможностей использования квази-цитат.mp3

TagLib: Could not open file D:/МУЗА/Alexei Aigi/929/01 Алексей Айги - Несколько возможностей использования квази-цитат.mp3

последняя строка означает что библиотека не смогла открыть файл с именем из кракозябр (потому что такого нету конечно, но если кракозябры переделать в русский текст то такой файл существует) и потому случился сегфолт. Возникает вопрос: как же переделать полученный как QString путь в char * сохранив при этом русскую кодировку ? Дело происходит в Win XP. :( Также возникает второй вопрос. Существует ли тут универсальное решение, ведь если у меня имя и путь к файлу будут не на русском языке а на другом не-english-языке, при не универсальном решении придётся мучаться с каждым языком :). Благодарю за ответы, Товарищи Земляки!


Название: Re: Перевод русского текста QString в char *
Отправлено: ритт от Ноябрь 04, 2010, 07:20
> QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );
с каких пор венда стала поддерживать utf-8?

> на первой же итерации происходит сегфолт после полной итерации.
зациклило...

> вот вывод:
вывод куда?

> последняя строка означает что библиотека не смогла открыть файл с именем из кракозябр
с каких пор венда стала поддерживать utf-8?

> сохранив при этом русскую кодировку
это какую-такую? ibm866? cp1251? iso-8859-5?.. русская кодировка...

> Существует ли тут универсальное решение
существует.

> как же переделать полученный как QString путь в char *
QString - это unsigned short *
char * - это char *
решение очевидно. нужно только ответить на вопросы выше ^


Название: Re: Перевод русского текста QString в char *
Отправлено: svalkadoma от Ноябрь 04, 2010, 10:33
Цитировать
> QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );
с каких пор венда стала поддерживать utf-8?
даже не знаю что ответить, т.к. вообще никогда не задавался этим вопросом, потому что кроме той проблемы что сейчас возникла я давно пишу на qt под windows и никаких проблем с кодировками не было.
Цитировать
> на первой же итерации происходит сегфолт после полной итерации.
зациклило...
итерация - одноразовое выполнение всего блока операторов внутри тела цикла. соответственно после одной такой итерации программа вылетела с сегфолтом.
Цитировать
> вот вывод:
вывод куда?
вывод на консоль (qDebug() как Вы знаете, всегда даёт вывод на консоль). сообщение об ошибке также выводится в консоль.
Цитировать
> последняя строка означает что библиотека не смогла открыть файл с именем из кракозябр
с каких пор венда стала поддерживать utf-8?
извините, но ответ аналогичен тому что выше :)
Цитировать
> сохранив при этом русскую кодировку
это какую-такую? ibm866? cp1251? iso-8859-5?.. русская кодировка...
такую, которая будет отображать русский язык в консоли корректно (наверное 866) либо iso)

Добавлено:
Вы действительно грамотно задаёте вопросы :). Спасибо ! :). Дело в том что я привык писать эти 3 строчки setCodec* и не обратил внимания. Действительно, закомментировав строку
Код:
QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );
и применив в параметр функции
Код:
TagLib::FileRef f(QString(dir+"/"+files.at(i).fileName()).toLocal8Bit().constData());
я получил правильный вывод. Большое спасибо администратору ! :)


Название: Re: Перевод русского текста QString в char *
Отправлено: kolob от Декабрь 02, 2010, 16:28
Если кому пригодиться то можно вот так сделать:
Код:
QString str = "бла-бла-бла";
char *ch;
ch = str.ascii();

Мне помогло для определенной задачи.


Название: Re: Перевод русского текста QString в char *
Отправлено: ритт от Декабрь 08, 2010, 17:54
пффф