読者です 読者をやめる 読者になる 読者になる

white croquis

日々の思索のためのクロッキー帳。オーディオやオススメなども。

Macで作成したm3uプレイリストの「FiiO X1」上での文字化けを回避する方法

f:id:align_centre:20150307021325j:plain

前回の記事で取り上げた、ハイレゾ・デジタル・オーディオ・プレイヤー(DAP)「FiiO X1」の問題点として、Mac上の VLC media playeriTunes で作成した「m3u」形式のプレイリストで欧文の「é, è」が文字化けしてしまうという問題があり困っていましたが、原因が判明し、解決法が見つかりました(^o^)/

まず Head-Fi.org の FiiO 公式のスレッドで聞いてみた

世界中のオーディオマニアが集うコミュニティサイト "Head-Fi.org" に、FiiO社の公式アカウントで新しいファームウェア 1.22beta のスレッドが立っていたので、まず試しに ファームウェア 1.22beta にアップデートしてみましたが、結果は変わらず。

そこで、スレッドに改善の要望をアップしてみました。

すると、別のユーザーから「文字コードANSI コードにすれば問題ないよ」とレスがあり、これが大きなヒントになりました。

元々、m3uプレイリストファイルは Mac 版の VLC media player で生成しており、デフォルトでは文字コードUTF-8 になります。そこで、テキストエディタで一旦 "Western(Mac Roman)" に変換して保存し、別のテキストエディタで開きなおして再度 UTF-8 に変換して保存した所、なんと文字化けしていた文字が認識されるようになりました。

欧文特殊文字だけでなく日本語の濁音・半濁音でも発生

当初作成した m3u プレイリストは洋楽のみだったため、「欧文特殊文字が化ける」だけだと思っていましたが、色々試してみると「日本語の濁音・半濁音」も表示がおかしくなり、m3u プレイリスト上でファイル名やフォルダ名に濁音・半濁音を含むファイルが認識・再生できませんでした。

f:id:align_centre:20150306180906j:plain:w360

Unicode/UTF-8 での文字の取り扱いのバリエーション「NFC」と「NFD」

以前 PDF で似たような現象に遭遇したことがあったので、これはもしやと UTF-8Mac OS X 関連の情報に当たってみると、ありました。

UnicodeUTF-8 で欧文特殊文字や日本語の濁音・半濁音を扱う方法として、

  • NFC(Normalization Form C: 特殊文字を1文字として扱う)
  • NFD(Normalization Form D: ベースとなる文字と特殊記号を別々の文字として扱う)

の2種類(実際には他にもあります)があり、OSやアプリケーション上では、どのOSも"NFC"を標準にしているのに対し、ファイルシステム(ディスクのフォーマット形式)においては、Mac OS X (HFS+) のみ "NFD" が採用され、それ以外のファイルシステムでは "NFC" が採用されているようです。

つまり、Mac OS X 上のファイルは、ファイル名は「NFD」で、ファイルの中の文字は「NFC」で記録されているということのようです。

いくつかのMac用ソフトでプレイリストを作成して試した所、iTunes, VLC media player, VOX では ID3 タグの曲名は NFC ですが、ファイルパスは NFD のままでした。
※プレイリストを作成するアプリケーションが変換してくれるといいのですが、NFD と NFC をめぐる事情はかなり複雑なので、ここではあえて触れないでおきます。

「違いの分かる」テキストエディタ "Sublime Text"

先ほど、複数テキストエディタを使って文字コードを変換して保存しなおしたら認識されるようになったと書きましたが、その一つが "Sublime Text" というテキストエディタです。


主に、プログラマーやWeb制作者などコードを書く人に重宝されているテキストエディタですが、他のエディタでは「NFD」形式のファイルを勝手に親切にも直してくれて1文字で表示してくれるので、全く見分けがつかないのですが、このエディタ、なんとNFC」と「NFD」の違いをちゃんと表示仕分けてくれるのです。

で、件のファイルを Sublime Text 2 で開いてみると、見事に謎が解けました。

f:id:align_centre:20150306233959p:plain:w360

テキストエディタを使わなくても "iconv" コマンドで解決!

"Sublime Text" のおかげで原因がハッキリし、少し調べてみると "iconv" というコマンドで NFD の文字列を NFC に変換できることもわかりました。

そこで試しに、次のようなコマンドを実行し、Sublime Text で開いてみると、無事 NFD が NFC に変換され、FiiO X1 でもプレイリスト中のファイル名が正常に認識され、再生できることが確認できました。

iconv -f UTF-8-MAC -t UTF-8 "playlist.m3u" > "playlist_nfc.m3u"


f:id:align_centre:20150307003436p:plain:w320 f:id:align_centre:20150306180737j:plain:w320

あとは、毎回 iconv コマンドを Terminal 開いて作業するのは面倒なので、"Automator" を使って簡単に行えるようにしてみました。

AutomatorMac で作った m3u プレイリストを楽々一括変換

f:id:align_centre:20150307150004p:plain:w240

Mac OS X に標準で入っている "Automator" というGUIで簡単に処理を自動化できるソフト、知っている人は知っているけど、知らない人は存在すら知らないソフトの筆頭かもしれません。ちょっとコツを覚えれば単純作業が劇的に楽になります。

そこで今回、Automator を使ってプレイリストファイルの中の文字を簡単に NFD から NFC にするワークフロー(バッチ)を作り、ファイルを選択して右クリックで簡単に変換できるようにしてみました。

Automator を起動して準備

ご注意:
諸般の事情で普段 Mac OS X は英語表示モードで使っているので、日本語表示の場合、メニューや機能の名称等が違うかもしれません。

まず「アプリケーション(Application)」の中にいる "Automator" を起動して "Service" を選択し、画面左のメニューから、'Get Selected Finder Item" と "Run Shell Script" を右側にドラッグして放り込みます。

そして、下図の赤枠で囲んだ部分のメニューを順に選択するだけで、"Run Shell Script" の中に処理のひな形が自動的に出来上がります。

f:id:align_centre:20150307151113p:plain

処理内容を記述して Service に登録

ひな形の

echo "$f"

と書かれている部分を次の文に置き換えます。

mv "$f" "${f%.*}"
iconv -f UTF-8-MAC -t UTF-8 "${f%.*}" > "${f%.*}.m3u"

m3u プレイリストファイルの拡張子は、アプリケーションによって .m3u だったり、.m3u8 だったりするので、拡張子を取り払った上で変換し、再度 .m3u の拡張子を付け直す処理にしました。

画面は次のようになります。

f:id:align_centre:20150307151544p:plain

あとは、"File" → "Save" で名前をつけて保存するだけです。
今回は、"m3u NFD to NFC" という名前にしました。

ファイルを選択して右クリック→Service で呼び出して処理を実行

以上の操作で Service に登録されるので、あとは、アプリケーションで生成したプレイリストファイルを選択し、右クリックして現れるコンテキストメニューで、一番下の "Service" に現れる、先ほど作った "m3u NFD to NFC" を選択するだけで変換できるようになります。

f:id:align_centre:20150307160828p:plain

処理が完了すると、次のように、変換された .m3u ファイルが出来上がり、元のファイルが拡張子なしのファイルとして残ります。

f:id:align_centre:20150307163326p:plain

元のファイルは「念のため」残しているだけなので、削除して構いません。
初めから削除するような処理にしてもよいでしょう。

ひとまずは問題解決!しかし…

FiiO X1 以外にも、同じように Mac で作成したプレイリストの欧文特殊文字や濁音・半濁音を含む曲だけ再生できないプレイヤーがあれば、同様の方法で解消できるかもしれません。

ただ、普通のユーザーなら諦めてしまう所かもしれないので、今後のファームウェアアップデートでNFDでも認識できるようにして欲しいと、FiiO に要望は送っておきました。

m3uプレイリスト上のファイル名にまつわる問題はひとまず解決した…かに見えましたが、レアケースとして、プレイリスト上でファイルパスの文字数が 125 文字を超えると認識されない(?)という現象が起きるようなので、これについてはまた Head-Fi.org で聞いてみようと思っています。

(そもそも、本当は iPod のようにプレイリストを読み込んだらファイルパスじゃなくて曲名が表示されるとありがたいのですが…)