今天使用在使用ifstream和ofstream創(chuàng)建文件和讀取文件時(shí),發(fā)現(xiàn)在中文路徑下一直失敗,而在英文路徑下則一切OK。
后來一查,原來是fstream的問題,微軟在實(shí)現(xiàn)ifstream的open方法時(shí),調(diào)用了mbstowcs_s先進(jìn)行文件名轉(zhuǎn)換,但mbstowcs_s依賴于當(dāng)前的locale的CTYPE設(shè)置,默認(rèn)CTYPE為C,也就是假定所有的字符都只有一個(gè)字節(jié)長(zhǎng),微軟對(duì)這種情況下進(jìn)行了特殊的轉(zhuǎn)換處理:
/* C locale: easy and fast */
while (count < n)
{
*pwcs = (wchar_t) ((unsigned char)s[count]);
if (!s[count])
return count;
count++;
pwcs++;
}
否則使用的是MultiByteToWideChar進(jìn)行轉(zhuǎn)換。所以有中文等多字節(jié)字符時(shí)就出錯(cuò)了。
解決辦法:
1、使用C語言的函數(shù)設(shè)置為中文運(yùn)行環(huán)境
setlocale(LC_ALL,"Chinese-simplified");
2、使用STL函數(shù)設(shè)置為系統(tǒng)語言環(huán)境
std::locale::global(std::locale(""));
但是據(jù)說這樣之后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,是為了將結(jié)束標(biāo)識(shí) '\0' 也轉(zhuǎn)化成 寬字符。
posted on 2007-12-11 22:50
李陽 閱讀(1588)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++