2011-04-12 61 views
1

問題:我想要TagLib :: FileRef在其文件名或路徑中打開一個帶有Unicode字符的文件,但不成功。TagLib - 如何處理UTF-8編碼的文件路徑?

在使用CMake 2.8.4創建Makefile後,我在Windows 7(64位,但是32位編譯器)下使用MinGW(GNU Make 3.81,GCC 4.4.0)編譯TagLib 1.7。我將TagLib與Qt 4.7.2框架結合使用。

對於兩個庫之間交換字符串,標籤庫提供:

#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如下:用含Unicode字符或拉丁路徑

TagLib::FileRef fileRef(QStringToTString(filePath).toCString(true)); 
// or: 
TagLib::FileRef fileRef(TagLib::FileName(QStringToTString(filePath).toCString(true))); 

其結果是,文件在UTF-8表示(f.ex.元音變音或中文字符)中使用不同代碼的-1個字符未能加載(fileRef.isNull())。

如果我通過false到上面的函數toCString()(聲明:見下文),TagLib可以處理單音節符號(但不是純Unicode字符)。因此,我想我錯誤地編譯了TagLib(TagLib :: FileRef將給定的字符串解釋爲Latin-1),但是我不知道如何檢查甚至糾正它。注意:使用TagLib可以正確檢索(ID3)標籤中的Unicode字符串。

toCString():

const char* TagLib::String::toCString(bool unicode = false) const; 

文檔:TagLib documentation

回答

1

FileRef的構造接受FileName對象,其可以是或char*wchar_t*(未String!)。在Windows上,您可以假設wchar_tQChar都有16位,所以您可以簡單地將它傳遞給filePath.constData()

請注意,如果您計劃運行在非Windows平臺的代碼,你需要有各地的FileRef對象創建一個#ifdef檢查,因爲在其他平臺上,只接受char*字符串,你應該使用QFile::encodeName(filePath).constData()

+0

Thanks,'TagLib :: FileRef fileRef(reinterpret_cast (filePath.constData()));'在Windows下工作良好。我打算在不同的系統上運行它;將'QFile :: encodeName()'可能UTF-8編碼這個? – bibermann 2011-04-20 12:50:48

+0

是的,現在大多數其他系統都使用UTF-8文件名,但它通常取決於用戶的設置,所以你不能認爲它是UTF-8。 – 2011-04-20 17:44:14