fstream 对中文的问题

在项目中遇到fstream无法处理中文文件路径的问题,通过分析原因,了解到是由于ANSI和UNICODE编码间的转换问题。文章介绍了三种解决方案,包括使用_TEXT()宏、设置全局locale以及使用setlocale函数,以确保fstream能正确打开含有中文的文件路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于 项目要增加对l10n的支持, 最近把项目中一个原来hard code 的部分, 现在用配置文件的方式进行的修改。

 用到了 fstream对文件进行处理。

发现当文件名有中文的时候, fstream的open 总是返回失败, google一把, 把一些学习到的东西放到下面,希望对大家有帮助吧。

 

1. 参考网页

让VS2005中的fstream支持中文路径文件打开

ifstream的open文件的时候出错

Ansi、Unicode、UTF8字符串之间的转换,wprintf

 

2. 产生问题的原因

 

 

(1)传统的计算机使用ANSI编码,在ANSI编码模式下,英文字符都用1个字节表示,而某些其它国家的文字(如汉字、日文),无法用单个字节来表示,ANSI便采用多个字节来表示这些字符(汉字是2个字节)。

(2)UNICODE包含UTF-8、UTF-16、UTF-32等多种编码方案(目前windows一般使用UTF-16)。拿UTF-16来说,规定所有字符都使用2个字节表示(不论英文字母还是汉字),对于超出2个字节范围的字符采用代理(采用4个字节表示)。

UNICODE相比ANSI有很多方面的优势(优势体现在哪?),微软非常提倡使用UNICODE编码方式,在MS较新版本的系统中都是采用UNICODE编码的。因此,即便我们在自己写的程序中使用了ANSI编码,系统会将其转换为UNICODE再对其进行处理。

我想大概是因为VS2005更加重视了对字符串的全球化支持,所以鼓励我们使用unicode编码的字符串,对于MBCS之类的支持可能就疏忽了吧

wbstowcs_s方法最终进入到了_mbstowcs_l_helper方法,
如果得到的是C locale,则它认为传进来的字符串为ASCII码,也就是单字节字符,它仅仅是进行了char到wchar_t指针的转换而已,那很显然第二个字节肯定为零,自然的字符就错了;
如果不是的话,它认为是多字节字符,将会调用MultiByteToWideChar进行转码。
在VC8里面,local默认是C locale,所以就出错了。以下为摘抄的该段代码:

 

 

3. 解决方法

 

 

希望上面的内容 对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值