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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача интернациональной строки в стороннюю либу [Решено]  (Прочитано 7137 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« : Июль 04, 2017, 00:00 »

Использую FreeImage для открытия\сохранения изображений (потому, что он умеет EXIF, а Qt - нет).
Соответственно для этого библиотеке нужно передать название файла. Названия могут быть такими:

Photo 203.png
Безымянный.png
肖像画.jpg

Эти файлы я считываю через

QString path = QFileDialog::getOpenFileName(...)

Полученную строку пытаюсь передать в либу, но все тщетно:
Если я передаю строку как path.toUtf8().data(), то все работает, только с латинскими названиями.
Если передаю как path.toLocal8Bit.data(), то либа работает только с латинскими названиями и названиями в кодировке текущей локали (в данном случае кириллицей).

Подскажите, пожалуйста, как правильно передавать строки в сторонние либы? Чтобы любые символы читались. Исходники в юникоде, внутри Qt все отображается как надо - проблемы только с либой.

Еще там есть возможность открытия\сохранения по строке типа const wchar_t * (utf16), но как я не пытался конвертировать QString, какую бы я строку не пихал в либо - не работает.

Либа: http://freeimage.sourceforge.net/
« Последнее редактирование: Июль 04, 2017, 14:48 от Torvald » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 574


Просмотр профиля
« Ответ #1 : Июль 04, 2017, 07:51 »

1. Скорее всего, необходимо преобразовывать текст с помощью QTextCodec::codecForLocale(), иероглифы здесь вряд ли прочитаются.
2. Если есть методы utf16, то должно работать QString::utf16 ().
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #2 : Июль 04, 2017, 14:47 »

Помогло это: https://stackoverflow.com/a/23894895
Как выяснилось в библиотеке используется fopen который на винде работает только для текущей локали. У него есть расширенная версия _wfopen, который работает в юникоде. К счастью, в либе есть вариант с _wfopen.
Решение выглядит так:
path.toStdWString().c_str()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 05, 2017, 05:02 »

Полезная инфа, не знал, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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