2

.NETforWindowsとMonoforMac/OSXを使用したクロスプラットフォームアプリケーションがあります。

私のアプリケーションはファイル名を処理し、ファイル名を文字列として含むシリアル化されたデータ構造をディスクに書き込みます。これらのファイル名の一部には、アクセントなどの国際文字が含まれています。

Windows(NTFS)で作成されたデータファイルをMacにコピーすると、名前にこれらの国際的なアクセント文字が含まれるファイルに問題が発生します。

NTFSから読み取られ、.NETによってシリアル化されたファイル名には、アクセント付き文字の1文字が含まれていますが、OSXでMonoを使用してファイルシステムからファイル名を読み取ると、シリアル化された表現と一致しない2文字の表現が得られます。WindowsとMacの両方で、シリアル化されたファイル名と実際のファイルシステムの間の一貫性を維持する必要があります。

たとえば、文字éはWindowsで.NETを使用してファイル名から取得され、整数値233の単一文字としてシリアル化されました。OSXでは、Monoを使用してコピーされたファイルのファイル名を読み取り、その文字は2文字で表されます。文字とアクセントを別個の文字として表す整数値101と769の。問題は、この表現がWindowsで作成されたシリアル化された表現と一致しないことです。

ファイル名を含むシリアル化されたデータ構造、またはファイル名自体のいずれかで、一貫性を強制する方法を見つける必要があります。

.NET / Monoに、これらのさまざまな文字列表現を正規化する方法はありますか?Normalize()メソッドを見ましたが、私が望むことを実行するとは思いません。それか私はドキュメントを理解していません。

NTFSは、アクセント付き文字の2文字表現でファイル名を保存することもできますか?もしそうなら、それは2つの表現を別個のものとして扱いますか?実際のファイル名自体で正規化を行う方がよい場合があります。

よろしくお願いします!

4

1 に答える 1

3

問題は、Windows と Mac OS X がファイル名の文字のエンコードに異なるシステムを使用していることだと思います。

この SO question に対する最初の回答によると、NTFS は UTF-16 を使用してファイル名を保存します。ただし、この SO の質問に対する 2 番目の回答によると、Mac OS X は、正規化形式 D を介して UTF-8 を使用してファイル名を保存します。この形式では、グリフ「é」が「e」(101) に「標準的に分解」され、アキュート アクセントが組み合わされます。マーク「´」(769)。

したがって、ファイル名をプレーン ASCII に制限しない限り、2 つのオペレーティング システムでファイル名の表現が異なるだけではないかと心配しています。

于 2013-01-30T23:37:34.093 に答える