今天使用在使用ifstream和ofstream創建文件和讀取文件時,發現在中文路徑下一直失敗,而在英文路徑下則一切OK。
后來一查,原來是fstream的問題,微軟在實現ifstream的open方法時,調用了mbstowcs_s先進行文件名轉換,但mbstowcs_s依賴于當前的locale的CTYPE設置,默認CTYPE為C,也就是假定所有的字符都只有一個字節長,微軟對這種情況下進行了特殊的轉換處理:
/* C locale: easy and fast */
while (count < n)
{
*pwcs = (wchar_t) ((unsigned char)s[count]);
if (!s[count])
return count;
count++;
pwcs++;
}
否則使用的是MultiByteToWideChar進行轉換。所以有中文等多字節字符時就出錯了。
解決辦法:
1、使用C語言的函數設置為中文運行環境
setlocale(LC_ALL,"Chinese-simplified");
2、使用STL函數設置為系統語言環境
std::locale::global(std::locale(""));
但是據說這樣之后cout又不能輸出中文了。
3. 傳入 Unicode 字符串.
wchar_t path[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, FilePath, (int)(strlen(FilePath)+1), path, MAX_PATH);
std::ifstream ifs;
ifs.open(wchar_path);
注:傳入strlen(FilePath)+1,是為了將結束標識 '\0' 也轉化成 寬字符。