1

我想读取从 Windows 注册表导出的 .reg 文件。我发现 .reg 文件被编码为 Windows UNICODE 文件(我认为它是 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,它会覆盖该"css"值),但它不会丢弃 BOM,并且文档中没有任何说明做。因此,您只需检查从文件中读取的前 2 个 WCHAR 以查看它们是否为 UTF-16LE BOM(UTF-8 BOM 将被解码为 UTF-16LE BOM)并在需要时忽略它们。

更新:我刚刚发生了一些事情。fgetws()将 BOM 的各个字节作为缓冲区中的各个 WCHAR 值返回。如果它尊重 BOM,则不应该这样做,这意味着它将文件解析为 Ansi/MBCS 而不是 UTF-16LE。你在使用 Visual C++ 吗?该"css"参数是 VC++ 特定的扩展_wfopen()。非 Microsoft 编译器供应商不支持它。

于 2012-12-01T03:36:11.797 回答