我想读取从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吗?如果是这样,为什么它会忽略FFFE
BOM?
答案 0 :(得分:2)
"css"
参数允许_wfopen()
检测BOM并标记FILE*
,因此它会正确解码文件的其余部分(如果存在BOM,则会覆盖{{1}但是它并没有丢弃BOM,documentation中没有任何内容可以说它。因此,您只需检查从文件中读取的前2个WCHAR,看它们是否为UTF-16LE BOM(UTF-8 BOM将被解码为UTF-16LE BOM)并在需要时忽略它们。
更新:刚刚发生了一件事。 "css"
将BOM的各个字节作为缓冲区中的单个WCHAR值返回。如果它尊重BOM,则不应该这样做,这意味着它将文件解析为Ansi / MBCS而不是UTF-16LE。你使用的是Visual C ++吗? fgetws()
参数是"css"
的VC ++特定扩展。非Microsoft编译器供应商不支持它。