MP3のタグと文字コードについてあれこれ

Medoly開発において気になったので、ちょっとだけMP3のタグの話。

MP3は汎用性は高いですが、そのタグの仕様が大変に厄介です。MP3が登場して20年ぐらい経ってると思いますが、未だに安定せず、頻繁に問題事を持ち込んでくれます。
 
まず、MP3のタグはID3タグと呼ばれる標準の規格が存在し、ID3.org において規格が管理されています。
ID3には大きく分けて、ID3v1と、ID3v2が存在します。細かく分けると、 ID3v1はID3v1と、ID3v1.1があり、ID3v2にはID3v2.2, ID3v2.3, ID3v2.4があります。ID3v1とID3v2は共存できますが、ID3v1は、今となっては使い物にならないので忘れましょう。
問題は ID3v2です。ID3v2.2, ID3v2.3, ID3v2.4は互いに互換性はありません。とりあえず一番新しいバージョンを使えばいいと思われそうですが、そうは問屋が卸しません。ID3v2.4はハードウェアやソフトウェアが対応していない事も多々あり、Windows Media PlayerやiTunesといった主要なソフトウェアは、少し前まで対応していませんでした。ID3v2.4は、文字コードにUTF-8が使えるようになったり、年だけでなく年月日が入力できるようになったりしてるといったいくつか変更はありますが、v2.3とそんなに大差はないです。現在、最も普及しているのはv2.3なので、それにしておくのが無難です。
 
そして、更に問題となるのが文字コード。 ID3v2タグには、文字コードを設定することができます。…が、文字コードとして設定できるのは、「ISO-8859-1」と「UTF-16」だけです。(v2.4はあまり使わないので、UTF-8が設定できることは忘れましょう。設定してもいいですが、多分読めないプレイヤー多数です。Medolyは読めるはずです。)

日本語を扱う上で、文字コードに「ISO-8859-1」を設定した上で、Shift_JISを入力する場面が多々あります。私から言いたい事は『金輪際そんなタグは入力しないでください』ということです。ISO-8859-1はあくまでも英語等のアルファベット文字を使う言語圏で使われる文字コードです。日本語はサポートされていません。「ISO-8859-1」と設定されているのに日本語が読めるのは、ISO-8859-1と設定した上で、Shift_JISの文字を入力しているからです。何故そのような事が慣例化しているかと言えば、MP3の黎明期、ID3v2のサポートが少なかったり、Unicodeのサポートが満足に行われていなかった時代があり、日本においては日本語の表示はこちらの方が安定していたためです。
ところが、MP3の仕様上はあくまでもISO-8859-1です。海外のソフトウェアでは日本語を読み込むことはまずできませんし、多言語が混在していた場合、それが日本語なのか、あるいは別言語なのか判別する手段がありません。
そのため今現代においては、全ての言語をサポートするUTF-16で入力した方が、確実に文字を読み込むことができます。MP3にはタグの文字コードがUTF-16と判別させる方法が存在するため、読み間違いが起こりません。

…が、事がそう単純にはいかない点もあります。ID3v2のタグの規格上、このタグの文字コードは「タグ毎に」設定することが出来てしまいます。すなわち、タイトルがISO-8859-1、アーティスト名がUTF-16となっているMP3が存在する可能性がある、という事です。例えば、作りが雑なタグ編集ソフトの場合、タグを編集した際にそのタグだけに勝手に文字コードを設定してしまうという場合もあるでしょう。

ところで、MedolyではShift_JISで入力された文字も判別できていますが、これは文字コード判別ライブラリを使って強制的に文字コードを判別させているためで
す。文字コードの判別処理というは、通常かなり力業な処理が行われており、特定の文字コードにしか登場しないコードパターンの出現で判別したり、といった
事を行います。すなわち、文字数が少なければ判定を誤る可能性が高い、ということです。タイトルだけ、アルバム名だけ、といった文字数程度では判別が失敗する可能性が高いです。ちなみにMedolyでは現状、タイトル、アーティスト名、アルバム名の文字を繋げて文字コードを判別させています。

つまり、UTF-16とISO-8859-1で入力された多言語がタグに混在したMP3は、正直こちらではお手上げ状態です。Meodlyでは、現状そのようなMP3は想定していません。最初に取得したタグに応じて残り全部の文字コードを決定しています(この処理は少し変更するかもしれませんが)。何せ文字コードの自動判定がアテにならないため、それがShift_JISなのか、はたまた中国語なのか韓国語なのか、こちらで判別する手段がないためです。
ちなみに、Medolyでは本当に何も判定できない場合は、最終的に端末使用言語に応じて文字コードを分岐させています。日本語ならShift_JISになります。

そんな感じで長々と書いてみましたが、MP3のタグの読み込み(特に文字化け)については、こちらで対応できる事に限界があります。Medolyは恐らく英語圏のソフトよりは、文字が読み取られる可能性が高いですが、それでも完璧というわけにはいきません。
文字コードについていくつかご質問やご意見を頂く場合がありますが、個人的には「質問を投げるぐらいなら、さっさと自分でタグをID3v2.3、UTF-16に直してしまった方が遙かに早い」と思ってます。M4A等の別の音楽形式使うのも有りです。

最後に言いたい事まとめ。
『MP3のタグはさっさと全部ID3v2.3のUTF-16に直すこと。話はそれから。』
『MP3タグの文字コードはタグ個別に設定できる。使用するタグ編集ソフトが吐き出す文字コードをきちんと確認。英語圏のソフトはISO-8859-1のタグとか平気で吐き出す場合がある。』
『MP3のタグ仕様は本当にクソ』