MP3のタグの文字化けについて
MP3のタグ情報の文字化けは厄介な問題の一つだ。
lameやid3v2などを使ってShift-JISでタグ情報を入力すればMac、Windowsや携帯プレーヤでは文字化けしなくなり、Linuxでも
を参考にすればgstreamerを使うものは文字化けを解消できる。
だが、Ubuntu11.04で登場したbansheeでだけなぜか文字化けしてしまう。
「Unixで音楽CDのエンコード 続編 - notes plastiques」で紹介したmp3spltを使うとなぜかどのプレーヤーでも文字化けしない。なぜだろう…というわけでいろいろ調べてた。
によると、ID3V2には文字コードを指定することができたらしい。知らなかった。
$00 - ISO-8859-1 (ASCII). $01 - UCS-2 in ID3v2.2 and ID3v2.3, UTF-16 encoded Unicode with BOM. $02 - UTF-16BE encoded Unicode without BOM in ID3v2.4 only. $03 - UTF-8 encoded Unicode in ID3v2.4 only.
多分デフォルトでは$00のASCIIが使用され、それがShift-JISとして解釈されていたのであろう。また、どのプレーヤーでも文字化けしないのは$01が指定されていたのではないか?と仮説を立ててみた。
でも、この文字コードを指定する方法がなかなかわからない。
いろいろ探してみた結果、こんなものを発見。
C++のid3libをRubyで使うというものらしい。gemでインストールする。詳しくは上のサイトを参照のこと。
Documentationに目を通したところ、文字コードの指定方法はわかったので、ここにサンプルコードを載せておきます。
#!/usr/bin/ruby require 'rubygems' require 'id3lib' require "kconv" class ID3Lib::Tag def title=(v) self.set_frame_text(:TIT2, v.toutf16) self.frame(:TIT2)[:textenc] = 1 end def album=(v) self.set_frame_text(:TALB, v.toutf16) self.frame(:TALB)[:textenc] = 1 end def artist=(v) self.set_frame_text(:TPE1, v.toutf16) self.frame(:TPE1)[:textenc] = 1 end end tag = ID3Lib::Tag.new('orig.mp3', ID3Lib::V2) tag.title = "たいとる" tag.album = "あるばむ" tag.artist = "あーちすと" tag.track = '5/13' tag.update!
id3lib-ruby utf16 · GitHub
ID3Lib::Tagを拡張しています。タイトル、アルバム、アーティストの代入だけ書き換えましたが、他のものについても同じように実装できると思います。
ちなみに、iTunesが使える環境であれば、iTunesを使って「ID3タグの変換」を実行することでUTF16にすることもできるようです。
追記: 「http://ruby-mp3info.rubyforge.org/」というのもある。こっちも文字コード指定できるようだ。