TagLib - Как обрабатывать пути к файлам в кодировке UTF-8? - PullRequest
1 голос
/ 13 апреля 2011

Проблема: я хочу, чтобы 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

1 Ответ

1 голос
/ 17 апреля 2011

Конструктор FileRef принимает объект FileName (не String!), Который может быть либо char*, либо wchar_t* строкой. В Windows вы можете предположить, что и wchar_t, и QChar имеют 16-битные значения, поэтому вы можете просто передать его filePath.constData().

Обратите внимание, что если вы планируете запускать код на платформе не-Windows, вам необходимо выполнить проверку #ifdef вокруг создания объекта FileRef, поскольку на других платформах он принимает только строки char*, и вам следует используйте QFile::encodeName(filePath).constData().

...