fstream 对中文的问题

记录fstream类读取UTF-8时出现乱码问题以及fstream读文件的几种方法 1.处理fstream类读取UTF-8时出现乱码问题,思路先将utf-8转换成UNICODE 再转化成ANSI #include <string> #include<fstream> using namespace std; string changeUTF8ToAnsi(const char * szU8) { int wcsLen = ::Mult... 阅读详情

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

 

 

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

C++ 读写utf-8文件 C++编码时有时会用到读写utf-8文件,c++11新特性里给了新的解决办法。 阅读详情

相关推荐

fstream类读取UTF-8、Unicode和ANSI文本文档乱码问题的解决方案

fstream类读取UTF-8、Unicode和ANSI文本文档乱码问题的解决方案 1、解决UTF-8类型的文本文档中文乱码读取(思路:将UTF-8转成Unicode然后再转ANSI) #include #include #include // #include #include //changeTextFromUtf8ToAnsi读取UTF-8格式的文件并将之保存为ANS

4936

fstream的使用和打开时存在中文中文路径可能失败的问题,其他中文问题都可以尝试采用如下方法

fstream中文路径  有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法: 1、使用C语言的函数设置为中文运行环境 setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函数设置为系统语言环境 std::locale::global(std::locale("")); 当然选2啦! 另转

cherishpart的专栏 741

21、C++文件

一、文本文件 ifstream:(input)、读文件 ofstream:(output)、写操作 fstream:读写文件 (1)、写文件 ---------------------------------------- #include<fstream> ofstream ofs; //创建流对象 ofs.open("文件路径", 打开方式); //打开文件 ofs<<"写入的数据"; //ofs,往文件上输出,cout...

m0_48716770的博客 954

VS2005 FSTREAM 不能打开中文路径名文件的问题!

VS2005 FSTREAM 不能打开中文路径名文件的问题!公司有一个项目从vs2003移植到vs2005之后老是出现runtim error经过排查最终定位在fstream 打开"含中文路径"的文件时候会出现fail的情况本来不相信vs2003过渡到2005会有这个问题,但是经过试验确证实了该问题我新建立一个exe来测试问题#include "stdafx.h" #include "testi

Augusdi的专栏 2477

fstream中文路径问题

fstream中文路径 问题:有时候用ifstream或ofstream打开带有中文路径的文件会失败。解决办法:1、使用C语言的函数设置为中文运行环境setlocale(LC_ALL,"Chinese-simplified");2、使用STL函数设置为系统语言环境std::locale::global(std::locale(""

seawt的专栏 768

[C++]fstream中文路径的问题

一、开始 用C++的fstream打开中文路径或者中文文件名的文件时,可能会有乱码或者打不开的问题。   ifstream is(strFileName); if(!is.is_open()) {    return0; }   这里返回的是0,一般的原因都是路径的问题。 二、方法 //设置为系统缺省,并将原来的locale返回保存在loc中  std::loc

songshu5555的专栏 1671

std::fstream中文目录问题

std::fstream无法直接处理中文目录,解决方法之一如下 locale::global(locale("")) file.open("d:\\中文路径.txt"); locale::global(locale("C")); //还原,否则cout有问题 不过如此一来, file locale::global(locale("",locale::all

lcmssd 922

fstream打开中文路径问题

locale::global(locale(""));   fstream ofile(TreeFilePath.c_str(),ios::out|ios::binary); locale::global(locale("C")); //还原全局区域设定

649

fstream处理中文时的小问题

VS2005   C++  Unicode 用fstream输出和读入有中文内容的文本文件时有问题 在缺省的C locale下,ofstream能正确输出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中输出中文。要解决这个问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstream和wofstream

只有偏执狂才能生存 2379

解决fstream.open()不能正确读取中文路径的问题

解决fstream.open()不能正确读取中文路径的问题 std::locale loc = std::locale::global(std::locale("")); //必须添加下面这句恢复,否则std::cout将无法正确输出中文名 std::locale::global(loc);

xieziwei2008的专栏 1711

c++转码基础(3):vs中fstream不支持打开中文问题

VS2005的fstream对于中文路径支持不好的bug。我想大概是因为VS2005更加重视了对字符串的全球化支持,所以鼓励我们使用unicode编码的字符串,对于MBCS之类的支持可能就疏忽了吧。    我搜索了一下这个问题的解决,参考了如下资料写了演示代码。 fstream中文路径  c++博客 About unicode settings in visual studio

wentianyao的专栏 545

fstream不支持中文文件名的问题

代码写多了啥问题都能遇到:)保存为中文文件名时发生了乱码.    ofstream of(szFilename);    of    of.close();解决方法1、使用C语言的函数设置为中文运行环境setlocale(LC_ALL,""); 2、使用STL函数设置为系统语言环境std::locale::global(std::locale(""));

眼界决定世界 奋斗成就梦想 1258

解决fstream不能打开带有中文路径文件的问题

方法1: 使用_TEXT()宏定义将字符串常量指定为TCHAR*类型 fstream file; file.open(_TEXT("c://测试//测试文本.txt")); cout<<file.rdbuf(); file.close(); 方法2: 使用STL中的locale类的静态方法指定全局locale,静态函数locale::global(newloc)可设置newloc为全局loca

winsonleung的专栏 1234

fstream打开含中文路径文件时失败的问题

最近写程序的时候遇到了使用ifstream打开含中文路径文件时失败的问题,在网上翻了一下,发现这是一个普遍遇到的问题,在很多人的博文中也都给出了一些解决技巧,但大多是转载的东西,很少对这个问题引发的原因有一个清晰、全面的解释。因此,我觉得有必要对该问题引发的原因作一个详细的剖析,希望对遇到同样问题的朋友们能有所帮助。 首先,用一个简单的例子来重现一下我所遇到的问题: (1)在VS200

学而时习之 不亦乐乎 1413

fstream中文路径

在C++的标准库中,std::fstream是个挺好用的文件读写流,操作文件很方便,因为是C++标准库,所以没有其它的环境依赖。在使用fstream过程中,有个打开中文路径文件会失败的问题,自己的代码中一直没处理好,这几天终于有点闲心,把这里改透。涉及很多知识点,也是个遗留已久的问题,特此做个记录。 在最后用了个一劳永逸的解决此问题方法:将fstreamFILE再包装下。 中文路径 使用fstream调试程序过程中,发现打开含中文路径的文件时,会打开失败。查了一些资料,说在VS2008、vs200..

zwb0540822的专栏 2215
上一篇: Shell脚本调试技术
下一篇: sizeof (1)
php_boy
博客等级 码龄20年 11粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值