46

WinXPシステムで英語以外の名前のファイル名を処理するためのプログラミングを始めたばかりです。ユニコードに関する推奨事項をいくつか読んだところ、基本的な考え方は理解できたと思いますが、まだはっきりしていない部分もあります。

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

UTF-8 でエンコードされた文字列を fopen() に手動でフィードしようとしました。

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

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

しかし、これは「ê°€.txt」として出てきました。

私は、(wchar_t*) ではなく (char*) を渡すいくつかの Windows アプリケーションを漠然と覚えているように見えるので、UTF8 でエンコードされた文字列が Windows でファイル名を開くのに十分であるという印象を受けました (これは間違っているかもしれません)。問題はありません。

誰でもこれに光を当てることができますか?

4

3 に答える 3

39

NTFS はファイル名を UTF-16 で保存しますが、fopenANSI (UTF-8 ではない) を使用しています。

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

于 2010-01-12T17:38:33.903 に答える
15

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

残念ながら、utf-8 はかなり最近になって発明されました。Windows API は、Unicode バージョンと Ansi バージョンに分けられます。文字列を取得または処理するすべての Windows API は、実際には W または A 接尾辞を使用して利用できます。「Wide」文字/Unicode の場合は W、Ansi の場合は A です。マクロ マジックはこれらすべてを開発者から隠しているため、ビルド構成に応じて char* または wchar_t* のいずれかを指定して CreateFile を呼び出すだけで、違いがわかりません。

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

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

そのため、Windows にはショートカットはありません。wchar_t* 文字列を使用して、wfopen またはネイティブ API CreateFileW (または Unicode ビルド設定を使用してプロジェクトを作成し、Createfile を呼び出すだけ) を使用する必要があります。

于 2010-01-12T18:20:44.847 に答える