跟踪后找到问题所在,发现ifstream在打开文件之前会通过_mbstowcs_l_helper函数把文件路径从mutilbyte转换到unicode。其中的关键转换函数如下:
if (_loc_update.GetLocaleT()->locinfo->lc_handle[LC_CTYPE] == _CLOCALEHANDLE)
{
/* C locale: easy and fast */
while (count < n)
{
*pwcs = (wchar_t) ((unsigned char)s[count]);
if (!s[count])
return count;
count++;
pwcs++;
}
return count;
}
而vc的默认local信息就是 _CLOCALEHANDLE,于是中文字符很悲剧的被转换成了 莫名其妙的一串东西。网上很多解决方法是重新setlocal,但是这样势必会影响底层的一些东西。这里我们其实只要在初始化ifstream时,传入unicode的中文路径或中文名即可,一切OK。