MP3のタグの文字化けについて

MP3のタグ情報の文字化けは厄介な問題の一つだ。

lameやid3v2などを使ってShift-JISでタグ情報を入力すればMacWindowsや携帯プレーヤでは文字化けしなくなり、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/」というのもある。こっちも文字コード指定できるようだ。