自分のMP3を瞬時に検索して聞けたらいいなーってことでMP3をMySQLに格納することに。
MySQL関係はPHPでこれまで扱ってきたんだけど、PHPだとMP3のID3タグを複雑に処理することが出来ない。
実際は不可能じゃないけど、PHPでバイナリ処理するなんてちょっと考えたくない。
ってことでml_ipod関係で使い慣れたID3Libを使って読み出してMySQL++を使ってMySQLにデーターを突っ込むことに。
ところが、ID3Libでいろいろ問題が発覚した。
ID3タグ規格はもともとマルチバイト文字を意識して作られていないのでShift-JIS形式だと問題が発生する場合が多い。
で、全てをUnicodeで処理するのが適切なのだがID3タグのUnicodeは一般的にUTF16が使われる。
ID3Libには GetRawUnicodeText() 関数が用意されていて、uint16 の配列で文字列を返してくれる。
しかし、どうもiconvなどで別の文字コードへ変換ができない。
どんな値が返っているか覗いて調べていると、どうもビットが反転している。
utxt = field->GetRawUnicodeText();
result = (ushort)(((utxt[i] & 0×00ff) << 8) | ((utxt[i] & 0xff00) >> 8));
上記のようにしてビットを反転することで無事使うことが出来た。
ちゃんと調べてないので詳しい原因は不明。
とりあえず報告しておこうかと思ったけど、もう既知のバグっぽい。