Creating FileRef object from QString

Lukáš Lalinský lalinsky at gmail.com
Sun Dec 6 09:12:43 CET 2009


On Sat, Dec 5, 2009 at 10:29 PM, Michael Pyne <mpyne at purinchu.net> wrote:
> On Saturday 05 December 2009 15:25:13 Plasty Grove wrote:
>> That makes sense, but even the following doesn't work:
>>
>> QString qstr = "/home/mydir/music/song.mp3";
>> QByteArray qbArray = qstr.toLocal8Bit();
>> const char* str = qbArray.constData();
>> TagLib::FileRef tagFile(str);
>>
>> In this case, I've got a local object which stores the value returned by
>> toLocal8Bit() and which is in scope when I'm using str. Does qbArray get
>> destroyed whenever constData() is called on it? When I'm debugging, I can
>> still see str holding a value when it goes to the next step.
>
> Perhaps an encoding issue if you don't use straight US-ASCII for your file
> names? In that case if "local8Bit" is not the encoding Taglib is expecting
> you'll get weirdness.
>
> The KDE JuK music manager uses taglib and has TString/QString conversion code
> (and I'm sure Amarok has the same thing) if you want to see how those projects
> do it.

TagLib::String will not help in this case, because it also represents
Unicode string, like QString. FileRef's filename parameter on
non-Windows platforms is char*, so you need the actual encoded bytes.
In Qt you can use QFile::encodeName(string) to encode the filename the
same way Qt does it for file dialogs or other places that interact
with the filesystem. This can still fail in some cases (different
mounted filesystems using different encodings), but it's the best you
can do if you store filenames as Unicode strings.

-- 
Lukas Lalinsky
lalinsky at gmail.com


More information about the taglib-devel mailing list