ここで実験する必要があるかもしれません。これは素晴らしい質問です。私は 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
これが、関数を使用する必要がある理由です。