锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源心得 / txt文件内容读取乱码
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究


txt文件内容读取乱码


出错背景

最近完成一个小项目,里面有个要求,加载txt文件,并显示里面的地方语言文本,打开后显示到CEdit里,显示成乱码。为了解决这个问题,前后用了3个办法才解决,有些细节比较麻烦,这里介绍下,供大家参考。

地方语言经验办法

以前在输入法项目开发时,用宽文本打开和宽文本读写方式可以实现正常打开,调试时看到变量里的文本不是乱码,所以试了下,当时可以,后面又不行。特别奇怪的是,在输入法环境下,宽模式是没问题的,这里把宽模式的代码介绍下:

	FILE *pFile=_wfopen(sfile,L"rb");//打开文件
	if(!pFile) return ;
	WCHAR trow[128]={L'\0'},tcleanrow[128]={L'\0'};
	//逐行读取字符串
	while(fgetws(trow,128,pFile))

在输入法代码里,txt文件里只有地方语言和英语,读取没问题。这段代码放到VS2010对话框项目下,不行。


setlocale调整

在txt里加有中文,则上面的办法就不行了,后来查到说是fgetws会在内部转换,对结果有影响,在开始调用_wfopen前加上setlocale调用,比如

setlocale(LC_ALL, "chs");

_wfopen里的rb改为r,则中文可以,地方语言不行。

wifstream模式

后来查到如下代码,问题得到解决:

	std::wifstream fsi;//宽的输入流 
	fsi.imbue(stdx::utf8_locale); //设置为utf8本地化
	fsi.open(sfile.GetBuffer());//打开文件
	if(!fsi.good()) //判断打开与否
	{
		AfxMessageBox(_T("不能打开文件") +sfile);
		return; 
	}
	wchar_t c;
	std::wstring s;
	while(fsi.get(c)) {//循环读取
		s.push_back(c);
	}

后续完善

要想在CEdit里正常显示,还需要注意回车换行,比如:

	if(sin.Find(_T("\r\n"))<0)
		sin.Replace(_T("\n"),_T("\r\n"));
友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内