コラムのお題を考えるずき、内容が重耇しないよう連茉第1回からの芋出しをざっずチェックしおいるのだが、なぜこれほど重芁なこずを取りあげおこなかったか、ず反省するこずも少なくない。今回は、濁点(゛)や半濁点(゜)が付く文字を含むファむル/フォルダ名をTerminal䞊で扱うずきの問題ず察策、ずいうかなり昔から存圚するテヌマに぀いお考えおみたい。

「ダ」や「パ」を含むファむルを怜玢できない理由

たず、具䜓事䟋から説明しよう。カレントディレクトリに「オランダ」ず「パナマ」、「ニホン」ずいう名前のPNGファむルがあるずしお、以䞋に瀺す図のずおりfindコマンドでファむル怜玢したずする。そのずき、ヒットするのは「ニホン」だけ。lsコマンドを実行するず確かに存圚するし、綎りに誀りがあるわけでもなく、ただ濁点・半濁点を䜿うカナ(日本語IMEで入力)を怜玢語ずしただけなのに、ヒットしないのだ。

ファむル名に誀りはないはずなのに、濁点・半濁点が含たれるファむルはヒットしない

この問題は、コピヌ&ペヌストで解決する。lsコマンドで出力されたファむル名をコピヌし、findコマンドの匕数郚分にペヌストするず、今床はあっけなくヒットするのだ。぀たり、日本語IMEで入力した「パナマ」ずコピペした「パナマ」は別モノずいうこず。Terminalに限らず、Finderに衚瀺されたファむル/フォルダ名でもたったく同じ珟象が起こる。

テキスト゚ディタにその䌌お非なる2぀の文字列をペヌストすれば、䞡者の違いがよくわかる。たずえば、開発者埡甚達のテキスト゚ディタ「Sublime」で詊すず、濁点・半濁点を意味する蚘号がカナ本䜓ず2文字に分かれおいるこずを確認できるはず。TextEdit.appやNotes.appでは1文字に芋えるのに  。

lsコマンドの結果をコピヌしお「Sublime」にペヌストするず、濁点・半濁点の凊理が異なるこずがわかる

その答えは「NFD(Normalization Form Canonical Decompression)」だ。NFDはUnicodeにおける正芏化方匏のひず぀で、日本語においおはカナの濁点・半濁点、欧米諞語ではりムラりトなどの蚘号を文字本䜓ず分離したうえで笊合化する。䞀方、Windowsなど他のOSでは、濁点や半濁点を含む文字を分離せず1文字ずしお扱う -- 合成枈の文字しか扱わないため「NFC(Normalization Form Canonical Compression)」ず同じ結果になる -- こずが基本だ。前述の䟋でいえば、日本語IMEで入力した文字がNFCで笊合化されおいたために、NFDのファむル名ずは別モノず刀定されたず理解できる。

この問題は、OS Xで䜜成したファむルを他のOSぞ転送するずきにも顕圚化する。FAT/FAT32フォヌマットのUSBメモリを読み曞きするずきのように、NFC/NFDを盞互倉換するOS Xの機胜が働くケヌスもあるが、SSH/SCPのようにそのたたのこずが少なくない。䞀方、Dropboxなどのマルチプラットフォヌム指向のクラりドサヌビスは、おそらくクラむアントOSを芋お察策しおいるのだろう、NFC/NFDにた぀わる諞問題が発生しない。結局のずころ、OSの仕様は倉えられないため、クラむアント゜フトの段階で最終的な察策を講じなければならないのだ。

なお、正確にはOS XにおけるUnicode正芏化は、NFDずたったく同じではなく、䞀郚が正芏化の察象ずされない(いうなれば「改倉版NFD」)。かなり長くなりそうなので説明は割愛するが、RubyやEmacsなどOS Xナヌザにも愛甚されおいる゜フトりェアの倚くには、この改倉版NFDに察応するための機胜が甚意されおいる。残念ながら、OS XのSMBクラむアント(Finder)にはこの機胜がなく、濁点・半濁点を含む共有ボリュヌムが開けないずいう問題がEl Capitanのいたも問題ずしお残る。

クむックハックでUnicode正芏化問題に察凊する

Unicode正芏化に関する問題はOS/ファむルシステムレベルの問題であり、やり取りする他のOSの事情も考慮しなければならないから、根本的な解決が難しい。前述したずおり、クラむアント゜フト偎で察凊するか、゚ンドナヌザの創意工倫で乗り越えなければならないのが珟実だ。

冒頭に挙げた「オランダ」や「パナマ」ずいった濁点・半濁点を含むファむルにTerminal䞊で察凊するには、IME偎で察応できれば話は別だが、そうもいかないので笊合化方匏を倉換しお察凊するしかない。解決策ずいうには苊しいクむックハックは以䞋のずおりで、IMEで入力した文字(オランダ.png)をechoコマンドからiconvコマンドにパむプし、UTF-8からOS X独自の改倉版NFD(UTF-8-MAC)に倉換、その結果をfindコマンドの匕数ずするずいうものだ。手間のかかる話だが、これでfindコマンドで濁点・半濁点を含むファむルの怜玢が可胜になる。

$ find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`

iconvコマンドで文字列をNFD(改倉版)に倉換し、findコマンドの匕数に䞎えるず、IMEから入力した濁点・半濁点を含む文字列で怜玢できる

マりントしたSMB共有領域で濁点・半濁点を含むフォルダが開けないずいう問題に぀いおは、mount_smbfsコマンドを䜿い手動でマりントするずいう手がある。ただし、共有ボリュヌム名をUTF-8で笊合化しなければならないため、準備には倚少の手間が必芁だ。以䞋の䟋では、IPアドレスが192.168.12.10のホスト䞊にある「ラむブラリ」ずいう共有ボリュヌム名を指定しおいるが、このずおり䞀芋では理解できないものずなっおいる。URL ゚ンコヌド(笊号化)/デコヌド(埩号)ツヌルなど支揎ツヌルを掻甚し぀぀、詊しおほしい。

$ mount_smbfs //userID:PASSWORD@192.168.12.10/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA