惊出一身冷汗啊,昨天项目中期报告,都有这个bug没有解决,还好昨天谭老师没有保存文件到桌面上,要不就麻烦了,今天发现了这个bug,网上找了写资料,整理如下:
bug出现原因:
vs2005中为了让std::wfstream(这个是MS自己搞的东西,C++标准中并未规定有wfstream)的路径支持wchar_t,所有 底层函数的路径都是转换成wchar_t来进行操作的。而在此之前VC2003的wfstream并不支持wchar_t作为路径,写STL的人并未使用 MS的标准API:MultiByteToWideChar及WideCharToMultiByte来进行wchar_t和char之间的转换,而是用 了C库的wcstombos来进行转换。而wcstombos并不像MultiByteToWideChar这样的函数可以在参数中指定代码页设置,它只 接受当前全句的locale设置。当全局的locale设置并不为wcstombos所要转换的文字的代码页时,BUG就出现了。
默认的locale设置为ANSI C,通过设置代码页为".936"可以解决中文DBCS到UNICODE的转换。因此,如果要解决这个BUG可以:
setlocale(LC_CTYPE, ".936");
设置全局locale来解决。不过
这 样将导致全局的locale改变。wcstombos是标准C库中的函数,并非STL中的库函数,所以无法只用locale类来对它造成单一影响。这么设 置的话,有可能std::cout将无法正确输出中文名,造成的影响似乎有点得不偿失。所以这个BUG最好不要用这种方式解决。还是等MS的SP补丁出来 看看是否解决了这个问题。在此之前可以考虑用C库的fopen来代替fstream.
最后:上面说过fstream底层都是用wchar_t来处理路径的,如果事先把路径转换成wchar_t传入进去也是可以的,但是这样也会带来一些问题:比如说VC2005以前的编译器将无法编译。
有时候用ifstream或ofstream打开带有中文路径的文件会失败。
解决办法:
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");
2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));
当然选2啦!
但是据说这样之后cout又不能输出中文了。
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=371229&SiteID=1
bug出现原因:
vs2005中为了让std::wfstream(这个是MS自己搞的东西,C++标准中并未规定有wfstream)的路径支持wchar_t,所有 底层函数的路径都是转换成wchar_t来进行操作的。而在此之前VC2003的wfstream并不支持wchar_t作为路径,写STL的人并未使用 MS的标准API:MultiByteToWideChar及WideCharToMultiByte来进行wchar_t和char之间的转换,而是用 了C库的wcstombos来进行转换。而wcstombos并不像MultiByteToWideChar这样的函数可以在参数中指定代码页设置,它只 接受当前全句的locale设置。当全局的locale设置并不为wcstombos所要转换的文字的代码页时,BUG就出现了。
默认的locale设置为ANSI C,通过设置代码页为".936"可以解决中文DBCS到UNICODE的转换。因此,如果要解决这个BUG可以:
setlocale(LC_CTYPE, ".936");
设置全局locale来解决。不过
这 样将导致全局的locale改变。wcstombos是标准C库中的函数,并非STL中的库函数,所以无法只用locale类来对它造成单一影响。这么设 置的话,有可能std::cout将无法正确输出中文名,造成的影响似乎有点得不偿失。所以这个BUG最好不要用这种方式解决。还是等MS的SP补丁出来 看看是否解决了这个问题。在此之前可以考虑用C库的fopen来代替fstream.
最后:上面说过fstream底层都是用wchar_t来处理路径的,如果事先把路径转换成wchar_t传入进去也是可以的,但是这样也会带来一些问题:比如说VC2005以前的编译器将无法编译。
有时候用ifstream或ofstream打开带有中文路径的文件会失败。
解决办法:
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");
2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));
当然选2啦!
但是据说这样之后cout又不能输出中文了。
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=371229&SiteID=1