vs2005环境,fstream不支持中文路径的问题

探讨了VS2005中std::wfstream处理wchar_t路径时遇到的问题及其原因。该问题源于wcstombs函数在不同代码页间的转换问题。文章提供了几种解决方案,包括设置全局locale环境和使用C库函数替代。
        惊出一身冷汗啊,昨天项目中期报告,都有这个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值