Проблема: я хочу, чтобы TagLib :: FileRef открывал файл с символами Unicode в имени или пути к файлу, но безуспешно.
Я скомпилировал TagLib 1.7 с MinGW (GNU Make 3.81, GCC 4.4.0) под Windows 7 (64-битный, но 32-битный компилятор) после создания Makefile с CMake 2.8.4. Я использую TagLib в сочетании с фреймворком Qt 4.7.2.
Для обмена строками между двумя библиотеками TagLib предоставляет:
#define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8)
#define TStringToQString(s) QString::fromUtf8(s.toCString(true))
// toUtf8() is a fix, originally spelled utf8(), but that's not relevant here.
Я построил TagLib :: FileRef следующим образом:
TagLib::FileRef fileRef( QStringToTString(filePath).toCString(true) );
// or:
TagLib::FileRef fileRef( TagLib::FileName( QStringToTString(filePath).toCString(true) ) );
В результате файлы с путями, содержащими символы Unicode или символы Latin-1 с другим кодом в представлении UTF-8 (например, umlauts или китайские символы), не загружаются (fileRef.isNull ()).
Если я передам false функции toCString () выше (объявление: см. Ниже), TagLib может обрабатывать умлауты (но не символы только для Unicode). Поэтому я предполагаю, что я скомпилировал TagLib неправильно (TagLib :: FileRef интерпретирует данную строку как Latin-1), но я не знаю, как это проверить или даже исправить. Примечание. Строки Unicode в тегах (ID3) корректно извлекаются с помощью TagLib.
toCString ():
const char* TagLib::String::toCString( bool unicode = false ) const;
Док: Документация TagLib