_wfopen可以将UCS2-LE编码的文件读入宽字符串缓冲区吗?

时间:2012-11-29 02:15:51

标签: file unicode encoding byte-order-mark crt

我想读取从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结果: enter image description here

可以_wfopen识别BOM吗?如果是这样,为什么它会忽略FFFE BOM?

1 个答案:

答案 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编译器供应商不支持它。