[prev in list] [next in list] [prev in thread] [next in thread]
List: taglib-devel
Subject: Re: Creating FileRef object from QString
From: Plasty Grove <plasty.grove () gmail ! com>
Date: 2009-12-06 10:51:37
Message-ID: eb2963f20912060239y63028e1ag319d21118e087711 () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
You're right about FileRef taking only const char *, and yes
QStringToTString doesn't help. But in addition, the function doesn't work. I
don't know if it's with the new qt libraries (I'm using 4.5.2). I took a
look at the macro definition for the function and it looks outdated. viz.
#define QStringToTString(s) TagLib::String(s.utf8().data(),
TagLib::String::UTF8)
QString no longer has a utf8() function.
But there is one thing I took away from this function that seems to work in
addition to toAscii() and that's toUtf8().data().
For some reason toUtf8().constData() doesn't work, but toUtf8().data()
works.
i.e.
TagLib::FileRef tagFile(qstr.toUtf8().data());
Would this be a more preferable way to do it than toAscii()?
Thanks,
Plasty.
PS: I also noticed that both Qt and taglib support utf16, but I tried it and
it didn't work and also I don't know much about UTF.
2009/12/6 Luká¹ Lalinský <lalinsky@gmail.com>
> On Sat, Dec 5, 2009 at 10:29 PM, Michael Pyne <mpyne@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@gmail.com
> _______________________________________________
> taglib-devel mailing list
> taglib-devel@kde.org
> https://mail.kde.org/mailman/listinfo/taglib-devel
>
[Attachment #5 (text/html)]
You're right about FileRef taking only const char *, and yes QStringToTString \
doesn't help. But in addition, the function doesn't work. I don't know if \
it's with the new qt libraries (I'm using 4.5.2). I took a look at the macro \
definition for the function and it looks outdated. viz.<br>
<br>#define QStringToTString(s) TagLib::String(s.utf8().data(), \
TagLib::String::UTF8)<br><br>QString no longer has a utf8() function.<br><br>But \
there is one thing I took away from this function that seems to work in addition to \
toAscii() and that's toUtf8().data().<br>
<br>For some reason toUtf8().constData() doesn't work, but toUtf8().data() \
works.<br><br>i.e.<br><br>TagLib::FileRef tagFile(qstr.toUtf8().data());<br><br>Would \
this be a more preferable way to do it than toAscii()?<br>
<br>Thanks,<br>Plasty.<br><br>PS: I also noticed that both Qt and taglib support \
utf16, but I tried it and it didn't work and also I don't know much about \
UTF.<br><br><br><div class="gmail_quote">2009/12/6 Lukáš Lalinský <span \
dir="ltr"><<a href="mailto:lalinsky@gmail.com">lalinsky@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); \
margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">On Sat, Dec 5, 2009 at \
10:29 PM, Michael Pyne <<a \
href="mailto:mpyne@purinchu.net">mpyne@purinchu.net</a>> wrote:<br>
> On Saturday 05 December 2009 15:25:13 Plasty Grove wrote:<br>
>> That makes sense, but even the following doesn't work:<br>
>><br>
>> QString qstr = "/home/mydir/music/song.mp3";<br>
>> QByteArray qbArray = qstr.toLocal8Bit();<br>
>> const char* str = qbArray.constData();<br>
>> TagLib::FileRef tagFile(str);<br>
>><br>
>> In this case, I've got a local object which stores the value returned \
by<br> >> toLocal8Bit() and which is in scope when I'm using str. Does \
qbArray get<br> >> destroyed whenever constData() is called on it? When I'm \
debugging, I can<br> >> still see str holding a value when it goes to the next \
step.<br> ><br>
> Perhaps an encoding issue if you don't use straight US-ASCII for your \
file<br> > names? In that case if "local8Bit" is not the encoding Taglib \
is expecting<br> > you'll get weirdness.<br>
><br>
> The KDE JuK music manager uses taglib and has TString/QString conversion \
code<br> > (and I'm sure Amarok has the same thing) if you want to see how \
those projects<br> > do it.<br>
<br>
</div>TagLib::String will not help in this case, because it also represents<br>
Unicode string, like QString. FileRef's filename parameter on<br>
non-Windows platforms is char*, so you need the actual encoded bytes.<br>
In Qt you can use QFile::encodeName(string) to encode the filename the<br>
same way Qt does it for file dialogs or other places that interact<br>
with the filesystem. This can still fail in some cases (different<br>
mounted filesystems using different encodings), but it's the best you<br>
can do if you store filenames as Unicode strings.<br>
<font color="#888888"><br>
--<br>
Lukas Lalinsky<br>
<a href="mailto:lalinsky@gmail.com">lalinsky@gmail.com</a><br>
</font><div><div></div><div \
class="h5">_______________________________________________<br> taglib-devel mailing \
list<br> <a href="mailto:taglib-devel@kde.org">taglib-devel@kde.org</a><br>
<a href="https://mail.kde.org/mailman/listinfo/taglib-devel" \
target="_blank">https://mail.kde.org/mailman/listinfo/taglib-devel</a><br> \
</div></div></blockquote></div><br>
_______________________________________________
taglib-devel mailing list
taglib-devel@kde.org
https://mail.kde.org/mailman/listinfo/taglib-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic