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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод русского текста QString в char *  (Прочитано 7162 раз)
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-языке, при не универсальном решении придётся мучаться с каждым языком Улыбающийся. Благодарю за ответы, Товарищи Земляки!
« Последнее редактирование: Ноябрь 04, 2010, 00:58 от svalkadoma » Записан
ритт
Гость
« Ответ #1 : Ноябрь 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 *
решение очевидно. нужно только ответить на вопросы выше ^
Записан
svalkadoma
Гость
« Ответ #2 : Ноябрь 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());
я получил правильный вывод. Большое спасибо администратору ! Улыбающийся
« Последнее редактирование: Ноябрь 04, 2010, 11:56 от svalkadoma » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #3 : Декабрь 02, 2010, 16:28 »

Если кому пригодиться то можно вот так сделать:
Код:
QString str = "бла-бла-бла";
char *ch;
ch = str.ascii();

Мне помогло для определенной задачи.
« Последнее редактирование: Декабрь 09, 2010, 14:25 от kolob » Записан

Qt 5.11.0, Win, MinGW
ритт
Гость
« Ответ #4 : Декабрь 08, 2010, 17:54 »

пффф
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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