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. 解决方法
希望上面的内容 对大家有用。
- fstream 对中文的问题
- fstream不支持中文文件名的问题
- fstream处理中文时的小问题
- fstream不支持中文文件名的问题
- [C++]fstream与中文路径的问题
- std::fstream的中文目录问题
- fstream和 中文路径问题
- fstream打开中文路径问题
- vs2005环境,fstream不支持中文路径的问题
- 解决fstream不能打开带有中文路径文件的问题
- VS2005 FSTREAM 不能打开中文路径名文件的问题!
- 解决fstream.open()不能正确读取中文路径的问题
- fstream的使用问题
- 解决fstream open 中文路径乱码问题!
- C++fstream文件流处理对中文字符不支持的解决办法
- C++fstream文件流处理对中文字符不支持的解决办法
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- 解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题
- 文件操作
- Java栈与堆
- Session
- C#反射机制
- C++读写文件
- fstream 对中文的问题
- TMS传输配置
- PHP 出现Notice: Use of undefined constant 的解决方案
- 常用算法(1) 将排序二叉树转换双向链表
- 对顺序容器的几点注意
- VS2010 -- fatal error C1189: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher
- 正规表达式实际使用案例之一:
- VS2010 -- 'back_inserter': identifier not found
- android音乐播放器监听电话状态