| ログイン | ご入会 |
ADC連絡先
|
|
|
|
|
Q: Mac OS X 用にファイルシステム(VFS)プラグインを書いています。テキストコードを正しく処理するにはどうすればよいでしょうか? A: Mac OS X では、VFS API のファイル名は、定義上、正規分解による Unicode 文字で、UTF-8 を使ってエンコードされています。このことが、いくつかの興味深い問題を引き起こしています。 合成済み文字と分解された文字この Q&A は、「合成済み Unicode 文字」および「分解された Unicode 文字」という用語を熟知していることを前提としています。これらの用語をよく知らない場合は、DTS Q&A 1235 Converting to Precomposed Unicode(合成済み Unicode への変換)に簡単な説明が掲載されています。
ボリューム形式ターゲットのボリューム形式が、合成済み Unicode と分解された Unicode のどちらを使用するかを定義します。たとえば、HFS Plus は分解された Unicode を使用し、UDF と SMB は合成済み Unicode を使用します。 残念ながら、いくつかのボリューム形式(たとえば、NFS)は承認された標準がありません。このことが、後述のように、さらにいくつかの課題を提示します。
名前を戻す上位のレイヤへ名前を戻すときには(たとえば、 名前の受け付けほとんどの場合、高レベルのソフトウェアは、分解された文字による名前をファイルシステムに渡します。ただしこれが保証されているわけではありません。合成済み文字による名前がファイルシステムに渡される状況がいくつかあります(その一部については後述します)。ファイルシステムに入ってきたときの状態に関係なく、基盤のボリューム形式に必要なエンコード体系に名前を変換しなければなりません。このため、基盤のボリューム形式が合成済み文字を要求する場合は、ディスクに書き込む前に、名前を合成済み文字の変形に変換しておく必要があります。同様に、ボリューム形式が分解された文字を要求する場合は、合成済み文字はすべて分解しなければなりません。 基盤のボリューム形式が標準を規定していない場合はどうすべきかという問題があります。ここではよい解決策がありません。アップルの NFS の実装のように、何の変更も加えずに、ユーザに選択してもらうための何らかのユーザインタフェース(AppleShare ログインダイアログの「文字セット」ポップアップのようなもの)を提供することはできます。いずれにしてもユーザエクスペリエンスは理想的なものにはならないでしょう。 実装Unicode コンバータ は、合成済み Unicode 文字を分解された Unicode 文字に変換する仕組みを提供します。これについてより詳しくは、DTS Q&A 1235 Converting to Precomposed Unicode(合成済み Unicode への変換)を参照してください。ただし、Unicode コンバータは、VFS プラグインが入っているカーネル内から呼び出すことができません。このため、おそらく Unicode を合成および分解するコードを自分で実行する必要があります。このための基本が、Technote 1150 HFS Plus Volume Formatの中の表で説明されています。 Apple Public Source License に同意すると、HFS Plus の実装でアップルが使用しているコードを参照することもできます。
お使いのファイルシステムでこのソースを利用しない場合でも、目を通しておくことを強く推奨します。合成済みと分解された Unicode テキスト間の変換は処理が複雑ですので、アップルのこの実装が、問題の範囲を理解する上で役立ちます。 この問題についての詳細は、Unicode コンソーシアムのウェブサイト を参照してください。Unicode のための国際的なコンポーネント(Unicode の国際化を目的とした IBM のオープンソースコード)で提供される正規化された関数を調べるのもよいでしょう。 互換性理論上、上記のテクニックは、アプリケーションにとっては互換性の問題につながる可能性があります。たとえば、アプリケーションが合成済み文字による名前の付いたファイルを作成した後、単純なバイナリ文字列比較を使ってそのファイルがあるかどうかディレクトリを反復して検索しても、ファイルは見つかりません。実際には、めったに起こらない問題です。基本ファイルシステムである HFS Plus は、この方法で動作するため、お使いのファイルシステムと互換性のないプログラムは、すべて HFS Plus とも互換性がありません。 アップルに組み込まれているファイルシステムのほとんどは、上記のテクニックを使用しています。大きな例外としては、NFS と UFS があります。特に NFS は、合成済み文字による名前のファイルを作成する Mac 以外のクライアントと共有できますが、Mac OS X の NFS クライアントは、それらをアプリケーションに戻す前に分解しません。ユーザがネイティブのコピープログラム(コマンドラインツールの cp など)を使って NFS ボリュームからお使いのボリュームにファイルをコピーした場合、コピープログラムは、名前を分解せずにファイルをコピーします。このためお使いのファイルシステムは、合成済み文字による名前でファイルを作成することが要求されます。上記のように、お使いのファイルシステムでは、これに対応するように準備しておく必要があります。
[2003 年 2 月 10 日] |