1

Windowsレジストリからエクスポートされた.regファイルを読みたいと思いました。そして、.regファイルがWindows UNICODEファイルとしてエンコードされていることがわかりました(最初の2バイトは:であるため、UCS2-LEでエンコードされていると思いますFFFE)。

だから私はこのようにファイルを読みました:

fp = _wfopen(lpszRegFilePath, _T("r, ccs=UNICODE"));
if ( NULL == fp)
{
    dwErr = ERROR_NOT_FOUND;
    break;
}
szData = new WCHAR[8192];
ZeroMemory(szData, 8192);

fgetws(szData, 8192, fp);
//........

szData結果 は次のとおりです。ここに画像の説明を入力してください

_wfopenはBOMを認識できますか?もしそうなら、なぜそれは単にFFFEBOMを無視するのですか?

4

1 に答える 1

2

この"css"パラメーターを使用_wfopen()すると、BOM を検出し、それに応じてマークを付けることができるFILE*ため、ファイルの残りの部分を正しくデコードできます (BOM が存在する場合は、値を上書きします)。ただし、BOM は破棄さ"css"れませんします。そのため、ファイルから読み取った最初の 2 つの WCHAR をチェックして、それらが UTF-16LE BOM (UTF-8 BOM は UTF-16LE BOM にデコードされる) であるかどうかを確認し、必要に応じてそれらを無視する必要があります。

更新:何かが私に起こりました。fgetws()BOM の個々のバイトをバッファ内の個々の WCHAR 値として返しています。BOM を尊重している場合、つまり、ファイルを UTF-16LE ではなく Ansi/MBCS として解析している場合は、これを行うべきではありません。Visual C++ を使用していますか? この"css"パラメーターは、 への VC++ 固有の拡張_wfopen()です。Microsoft 以外のコンパイラ ベンダーはサポートしていません。

于 2012-12-01T03:36:11.797 に答える