kubotaの日記: ファイル名のエンコーディング
ファイル名にASCII以外の文字を使う場合、そのエンコーディングは何にするのがいい?という話。
現状では、みんな好き勝手に自分の好きなエンコーディングで記録してる。でもそれだと、相互運用に不便だし、ロケールを変えるだけでファイル名が変わってしまう。要するに、ファイルシステムやアーカイブに書き込まれたファイル名は静的なものだけど、ロケールは動的なもの、という違いのために、不都合が生じることがあります。
そこで、UTF-8などに決めてしまえ、という議論が出てくるんだけど、一方で、ls と打ったときにロケールにかかわらずファイル名が UTF-8 で表示されるのはまずい。だれがそこの変換を受け持つのか?
考えられるのは、
- 個々のアプリケーション (ls など)
- ライブラリ (libc)
- カーネル (ファイル サブシステム)
だけど、個々のアプリケーションにいちいち iconv() とかを実装してたら重くて仕方がないし、「いっせーのーで」で全アプリケーションをとっかえないといけないけどそんなの不可能。ライブラリだと、fopen() と open() とでエンコーディングに相違ができてしまう。カーネルはロケールを知らないしカーネルから iconv() は呼べない。と、どれをとってもいまいち。
というわけで、現状がいちばんまともなような気がしてきた。つまり、ファイル名のエンコーディングについては一切のとりきめがなくて、すべてのソフトウェアはファイル名を単なるバイト列とみなしていて、ユーザーの側がそれを好きに解釈していい、という現状。もしソフトウェアにファイル名のエンコーディングについてなにか仮定を持ち込めば、ユーザーはそれに拘束されてしまうことになるし。
というか、UCS と他のエンコーディングや文字集合との、信頼できてみんながそれに従う対応表を作ってくれ。(政治的に絶対に無理なんで、ないものねだりになっちゃうんだけど)。でないと、ファイル名にエンコーディング変換を持ち込むなんて、危なっかしくて仕方がない。ファイルの同一性を保証するのはファイル名だけなんだから。