15

私が理解している限り、NTFS は Unicode ファイル名をサポートしています (Micorsoft が主張するように UTF-16?)。

しかし、公式の MSDN ドキュメントは、FAT-32 でファイル名 (ファイルパス) を保存するために使用されるコードページに関して非常にあいまいです。

ここでは、ファイル名を保存するためにOEMコードページ(私が推測するCP437)が使用されていると述べています:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317748.aspx

しかし、ここでは、 CP437がその 1 つである異なるOEM コードページが存在する可能性があることがわかります。

また、 mountなどのユーティリティは、OEM コードページ セットだけでなく、FAT 用にさらに多くの異なるコードページをサポートするようになりました。

では、FAT-32 ファイル名の実際の cdepage は何ですか? FAT ボリュームを作成したときのシステムのコードページに依存しますか? FAT は、UTF-16 のような真の 2 バイト文字セットのコードページをサポートできますか? または、UTF-8 のようなマルチバイト文字セットのコードページが限界ですか?

さらに具体的な質問: CreateFileW 関数 (MSDN が述べているように、ファイル名のコードページとして UTF-16 を使用) を使用して FAT-32 ボリュームにファイルを作成するとどうなりますか?

4

2 に答える 2

8

ここで実験する必要があるかもしれません。これは素晴らしい質問です。私は 100% の自信があるわけではありませんが、

では、FAT-32 ファイル名の実際のコードページは? FAT ボリュームを作成したときのシステムのコードページに依存しますか?

システムの「OEM コードページ」。

FAT は、UTF-16 のような真の 2 バイト文字セットのコードページをサポートできますか? または、UTF-8 のようなマルチバイト文字セットのコードページが限界ですか?

いいえ、FAT が直接 UTF-16 または UTF-8 に対応しているとは思いません。とはいえ、Microsoft は Unicode ファイル名を帯域外の方法で保存します。したがって、ファイルには 2 つのファイル名があります。(これにより、8.3 文字よりも長いファイル名を使用することもできます。)

さらに具体的な質問: CreateFileW 関数 (MSDN が述べているように、ファイル名のコードページとして UTF-16 を使用) を使用して FAT-32 ボリュームにファイルを作成するとどうなりますか?

に渡される Unicode ファイル名はCreateFileW、帯域外ファイル名に直接格納されます。これは OEM コードページ (システム上にあるものは何でも) に再エンコードされ、そこに配置されます。OEM コードページに変換できない場合、または 8.3 文字を超える場合、Windows はファイルをFILENA~1.TXT.

これらの回答の引用:

まず、このページは OEM コード ページ != Windows コード ページであることを示しています。

FAT ファイルを作成する非 Unicode アプリケーションでは、標準の C ランタイム ライブラリ変換関数を使用して、Windows コード ページの文字セットと OEM コード ページの文字セットを変換しなければならない場合があります。ファイル システム関数の Unicode 実装では、このような変換を実行する必要はありません。

典型的なアメリカのシステムでは、OEM コード ページは"CP437"ですが、Windows コード ページはWindows-1252です(FooA呼び出しは Windows コード ページを使用すると思いますが、アメリカのマシンでは通常 Windows-1252 ですが、ロケールによって異なります)。

使用可能な FAT ボリュームがある場合は、この動作を確認できます。文字「Σ」(U+03a3) は、Windows-1252 には存在しませんが、CP437 には存在します。短いファイル名と長いファイル名の両方をdir /X. という名前のファイルを使用すると、次のように表示されasdfΣ.txtます。

ASDFΣ.TXT    asdfΣ.txt

ただし、「asdfΛ.txt」という名前のファイル (Λ は CP437 にも Windows-1252 にも存在しません) では、次のように表示されます。

ASDF~1.TXT   asdf?.txt

(のフォントは Λ を表示できない?ため、おそらく が表示されます。)cmd.exe

長いファイル名については、このウィキペディアの記事を参照してください。

また、興味深いことに、ファイルに「asdf©.txt」という名前を付けると、次のようになります。

ASDFC.TXT    asdfc.txt

… ここで 100% 確信があるわけではありませんが、Windows は巧妙に「c」を © に置き換え、同様に表示することを決定したと思います。フォントを Consolas などのラスター ベースではないものに変更すると、次のように表示されます。

ASDFC.TXT    asdf©.txt

FooWこれが、関数を使用する必要がある理由です。

于 2013-10-22T01:37:12.797 に答える
2

基本的な FAT または FAT32 ディレクトリ エントリは、現在の OEM コードページの短い名前(古い DOS 8.3 形式) のみをサポートします。ただし、Windows で使用される VFAT (長いファイル名をサポートする FAT) は、ファイルごとに追加のいわゆる長いファイル名を UTF-16 で格納できます。

于 2013-10-22T10:50:25.283 に答える