4

テキスト ファイルをリソースに追加してから読み込むことで、プロジェクトにリンクしています。

と を使用LockResourceしてstatic_castにキャストしますstd::wstring
std::wstring sData(static_cast<wchar_t*>(pData));

私のプロジェクトでは UNICODE (windows) を使用しているため、 と を使用std::wstringしてwchar_tいます。

ファイルのエンコーディングを UCS-2 LE に設定する必要があることがわかりました。これは、Windowsが使用するエンコーディングであるためだと思います。

私の質問は、すべての Windows オペレーティング システムが現在 UCS-2 LE を使用していると想定しても安全でしょうか? UCS-2 BE (またはその他のもの) を使用するシステムに遭遇したくありません。私のプログラムは恐ろしくクラッシュします。

ファイルを ANSI で保存してから、オペレーティング システムが で使用しているエンコーディングに変換することもできますが、MultiByteToWideCharそれが間違いなく UCS-2 LE になる場合、これは時間の無駄になります。

4

2 に答える 2

6

最近および現在のバージョンの Windows (XBox を除く) はすべて UTF-16 LE を使用します。

文字列変数の初期化方法にバグがあることに注意してください。

std::wstring sData(static_cast<wchar_t*>(pData));

これは、リソースが終了 (2 バイト) 0 で終了することを前提としています。これは、リソース内のファイルを参照しているだけの場合は保証されないと思います。リソースのサイズを取得し、sData の 2 ポインター コンストラクターを使用する必要があります。

時間が心配な場合 (使用に関するコメントで示唆されているようにMultiByteToWideChar)、リソースから動的メモリにデータをコピーしていることに注意する必要があります。このコピーはおそらく変換を行うのと同じくらい遅いです。これを一度だけ行う場合は、速度について心配する必要はありません。テキストをUTF-8として保存しMultiByteToWideChar、特にUTF-8エンコーディングがテキストに対してより効率的である場合は、バイナリを小さくするため、を使用します。

速度が問題になる場合 (および実行時に文字列を変更する必要がない場合) は、 astd::wstringをまったく使用しません。同様のインターフェイスを提供するクラスを作成しますが、テキスト全体を動的メモリにコピーするのではなく、リソース メモリを直接指すようにします。これにより、ロード時間とメモリが節約されます。

于 2012-08-29T15:51:48.330 に答える
0

Windows のすべてのバージョンは LE であり、Microsoft が OS を BE に変更する計画はないと思います。Windows NT 5(Win2K) 以降はすべて UTF-16 に基づいているため、Windows が UCS-2 LE であると想定することは常に安全です。

于 2012-08-29T15:14:52.077 に答える