fstream 对中文的问题

来源:互联网 发布:通达信有mac版指标导入 编辑:程序博客网 时间:2024/05/21 06:47

由于 项目要增加对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. 解决方法

 

 

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