意味 - windows ファイル名 文字コード 変更



NTFSのファイル名はどのようにエンコードされていますか? (2)

NTFSはUTF16でファイル名を格納しますが、fopenはANSI(utf8ではなく)を使用しています。

UTF16でエンコードされたファイル名を使用するには、ファイルオープンコールのUnicodeバージョンを使用する必要があります。 これを行うには、プロジェクトでUNICODEと_UNICODEを定義します。 次に、CreateFile呼び出しまたはwfopen呼び出しを使用します。

私はちょうどWinXPシステム上で英語以外の名前のファイル名を扱ういくつかのプログラミングを始めています。 私はユニコードでいくつかの推奨読書をしてきましたが、私は基本的な考え方を得ていると思いますが、一部の部分はまだ私には分かりません。

具体的には、NTFSに格納されているファイル (コンテンツではなくファイルの実際の名前)はどのエンコーディング(UTF-8、UTF-16LE / BE)ですか? char *をとるfopen()を使用してファイルを開くことは可能ですか?wchar_t *を使用するwfopen()を使用する以外に選択肢がありません。おそらくUTF-16文字列が使用されますか?

私は手動でUTF-8でエンコードされた文字列をfopen()に送り込みました。

unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // 가.txt

FILE* f = fopen((char*)filename, "wb+");

これは 'ê°€.txt'として出てきました。

私は、UTF8でエンコードされた文字列がWindows上でファイル名を開くのに十分であるという印象(間違っているかもしれない)の下にあった。なぜなら、(wchar_t *)ではなく、問題はありません。

誰かがこれについていくつかの光を当てることができますか?


Answer #1

fopen() - ウィンドウ上のMSVCでは(デフォルトでは)utf-8でエンコードされたchar *を取りません。

残念なことに、utf-8は、むしろ最近の大きなスキームで発明されました。 Windows APIは、UnicodeとAnsiのバージョンに分かれています。 文字列を受け取ったり扱ったりするすべての Windows APIは実際にはWまたはAの接尾辞--Wでは "ワイド"文字/ Unicode、AnsiではAで使用できます。 マクロ・マジックはこれをすべて開発者から隠しているので、違いを知らずにビルド構成に応じてchar *またはwchar_t *を指定してCreateFileを呼び出すだけです。

'Ansi'エンコーディングは、実際には特定のエンコーディングではありません。 - しかし、 "char"文字列に使用されるエンコーディングは、PCのロケール設定に固有です。

現在、fopenのようなc-runtime関数は開発者の知識なしにデフォルトで動作する必要があるため、WindowsシステムではWindowsのローカルエンコーディングで文字列を受け取ることを期待しています。 msdnは、Microsoftのcランタイムapi setlocalが現在のスレッドのロケールを変更できることを示しますが、utf-8のように、文字あたり2バイト以上必要なロケールでは失敗すると具体的に言われています。

したがって、Windows上にはショートカットはありません。 wchar_t *文字列を使用して、wfopenまたはネイティブAPI CreateFileW(またはUnicodeビルド設定を使用してCreatefileを呼び出す)を使用する必要があります。





ntfs