blog.sorah.jp

Banshee に iTunes ライブラリをインポートする時に日本語なファイル名の一部で not found 言われる件

前提

  • netatalk の AFP サーバーに対してファイルを転送した。

現象

Banshee という Linux の iTunes みたいな音楽管理ソフトの iTunes ライブラリ取り込み機能を利用した時に日本語ファイル名の一部で存在するのに存在しないと言われる。

原因

OS X の HFS+ は Unicode の Normalization Form D という方向で符号化された物がファイル名として使われている。

Normalization Form とは何か

Normalization Form とは Unicode は複数の形で一つの文字を表す事ができるので、それをどちらかに一般化 (normalize) する時に使う変換方法等の事。

http://unicode.org/reports/tr15/#Norm_Forms の Table 1. を見ると Normalization Form は 4 種類あって、

  • Normalization Form D (NFD) - Canonical Decomposition, 正準等価 で文字を 分解
  • Normalization Form C (NFC) - Canonical Composition, NFD で文字が一度正準等価で分解された後に正準等価で 結合 される
  • Normalization Form KD (NFKD) - Compatibility Decomposition, 互換等価 で文字を 分解
  • Normalization Form KC (NFKC) - Compatibility Composition, NFKD で文字を一度互換等価で分解した後に互換等価で文字を 結合

文字の分解・結合とは、上記したとおり Unicode はひとつの文字でも複数のバイト列で表面上同じ文字を表すことができる。

  • 分解 はなるべく一つの文字を複数に分ける事
  • 結合 はなるべく複数の文字からなる一つの文字をひとつにする事

たとえば「 」については「 」 + 「 」という風に分ける事ができる。この分ける事が分解で、これを「 」に戻す事が結合。もちろん「 」は実際 Finder 等では一つの文字に結合されて見える。一部のソフトウェア等を使った時にばらけて視えるかもしれないけど。Wine のファイル選択ダイアログとかね。

OS X の HFS+ はこの Normalization Form D を一部もじった物が使われているそうで。 要するになるべく文字が分けられているという。これを UTF-8-MAC と呼ぶらしい。

で、それが何?

Linux に転送するときに netatalk の AFP サーバーを使った。 この時 netatalk はこの UTF-8-MAC なファイル名を NFC で結合してくれているらしい。

しかし iTunes Music Library.xml, ファイル名等を記録しているライブラリファイルに入っているファイル名はまだ UTF-8-MAC のままである。

つまり、ファイルシステムには NFC されたファイル名なのに iTunes ライブラリに記録されているのは UTF-8-MAC なファイル名のままだから Not Found 言われる。

直す

なんというか、最初 Perl の Encode::UTF8Mac とかがラクなのか面倒だなと思ったら Ruby 1.9 の Encoding にあった。ありがとう成瀬さん!

というわけで Ruby 1.9 系では何も考えずに UTF-8-MAC の変換ができるよ! やったね!

URI エスケープ解く時に CGI じゃなくて URI 使ってるのはスラッシュとかまでエスケープしてほしくないから。これでも &#… みたいな記号表記があった時に #%23 にしてエラーがでてしまわないように &%23&# に戻してやる必要があった。

スクリプト

例によって 1.9 系が必要です。1.9.3 未満で動くかしらないけど。

https://gist.github.com/1781204

自己責任でね!

使い方

itunes_nfc.rb にスクリプトを保存したとすると:

$ cp iTunes\ Music\ Library.xml iTunes\ Music\ Library.orig.xml
$ ruby itunes_nfc.rb iTunes\ Music\ Library.xml > iTunes\ Music\ Library.xml

これで OK.

おまけ

Banshee さん iTunes Music Library.xml が異常だとインポート時にフリーズする…

参考文献

Backfilled at , Published at