5

Windows と OS X で生成されたファイル名の間のマッピングを作成する必要があります。OS X が「すべてのファイル名を分解された Unicode に変換する」ことは知っていますが、「ほとんどのボリューム形式は、これらの標準形式の正確な仕様に従っていません」

したがって、標準の UTF8 API を使用して Windows 名を NFD に変換し、正しい OS X 名を持っていることを確認するのは簡単なことではないようです。実際にファイル システムにファイルを作成せずに実際の OS X ファイル名を特定し、ディレクトリをスキャンして実際に作成されたファイルを確認する方法はありますか?

4

3 に答える 3

3

答えは TechNote 1150 HFS Plus Volume Format からだと思います:

注: Mac OS テキスト エンコーディング コンバーターには、HFS Plus ボリュームに保存されている正規の分解された形式との間の変換を可能にするいくつかの定数が用意されています。CreateTextEncoding を使用してテキスト エンコーディングを作成する場合、TextEncodingBase を kTextEncodingUnicodeV2_0 に設定し、TextEncodingVariant を kUnicodeCanonicalDecompVariant に設定し、TextEncodingFormat を kUnicode16BitFormat に設定する必要があります。これらの値を使用すると、Unicode 標準が進化しても、Unicode は HFS Plus ボリュームと同じ形式になります。

于 2012-10-26T19:22:57.320 に答える
3

あなたはおそらく-[NSString fileSystemRepresentation]方法を探しています。

このタスクには一般的な解決策がないことに注意してください。有効なファイル名は、保存するボリュームのファイルシステムによって異なります。たとえば、HFS+ で有効なすべてのファイル名が FAT32 で有効なわけではありません。

Mac の「標準」ファイルシステム (現在は HFS+) の場合、fileSystemRepresentation必要なものが得られるはずです。他のファイル システムの場合、一般的な方法はありません。たとえば、存在しないが将来導入されるものについて考えてみてください:)

于 2012-10-26T19:34:43.023 に答える
0

リンクによると、ファイルシステム ドライバーは (ほとんどの場合) 2 つの動作のいずれかに従うように見えます: * NFD のすべての名前を返し、必要に応じて名前を変換します。* 変換は行わないでください。

どちらの場合も、OSX で NFD でファイルを作成した場合、OSX で読み返すと、NFD で名前が付けられます。

OTOH、ファイル名が Windows → NFS → Mac で、何らかの同期を行いたい場合は、運が悪いです。根底にある問題は少し哲学的であるため、これは簡単なことではありません。ファイル名はバイト文字列または Unicode 文字列である必要がありますか? Unix は伝統的に前者を行っていると思いますが、少なくとも Linux では、UTF-8 NFC 名は単なる慣習です。

(さらに悪いことに、IIRC HFS+ は Unicode 3.something を使用するように定義されているため、使用する API が特定の Unicode バージョンを保証できない限り、それ以降に追加/変更された文字に対して単純な NFD への変換が間違っている可能性があります。)

于 2012-10-26T19:41:24.493 に答える