[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&#39;re right about FileRef taking only const char *, and yes QStringToTString \
doesn&#39;t help. But in addition, the function doesn&#39;t work. I don&#39;t know if \
it&#39;s with the new qt libraries (I&#39;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&#39;s toUtf8().data().<br>

<br>For some reason toUtf8().constData() doesn&#39;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&#39;t work and also I don&#39;t know much about \
UTF.<br><br><br><div class="gmail_quote">2009/12/6 Lukáš Lalinský <span \
dir="ltr">&lt;<a href="mailto:lalinsky@gmail.com">lalinsky@gmail.com</a>&gt;</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 &lt;<a \
href="mailto:mpyne@purinchu.net">mpyne@purinchu.net</a>&gt; wrote:<br>


&gt; On Saturday 05 December 2009 15:25:13 Plasty Grove wrote:<br>
&gt;&gt; That makes sense, but even the following doesn&#39;t work:<br>
&gt;&gt;<br>
&gt;&gt; QString qstr = &quot;/home/mydir/music/song.mp3&quot;;<br>
&gt;&gt; QByteArray qbArray = qstr.toLocal8Bit();<br>
&gt;&gt; const char* str = qbArray.constData();<br>
&gt;&gt; TagLib::FileRef tagFile(str);<br>
&gt;&gt;<br>
&gt;&gt; In this case, I&#39;ve got a local object which stores the value returned \
by<br> &gt;&gt; toLocal8Bit() and which is in scope when I&#39;m using str. Does \
qbArray get<br> &gt;&gt; destroyed whenever constData() is called on it? When I&#39;m \
debugging, I can<br> &gt;&gt; still see str holding a value when it goes to the next \
step.<br> &gt;<br>
&gt; Perhaps an encoding issue if you don&#39;t use straight US-ASCII for your \
file<br> &gt; names? In that case if &quot;local8Bit&quot; is not the encoding Taglib \
is expecting<br> &gt; you&#39;ll get weirdness.<br>
&gt;<br>
&gt; The KDE JuK music manager uses taglib and has TString/QString conversion \
code<br> &gt; (and I&#39;m sure Amarok has the same thing) if you want to see how \
those projects<br> &gt; do it.<br>
<br>
</div>TagLib::String will not help in this case, because it also represents<br>
Unicode string, like QString. FileRef&#39;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&#39;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