精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究
最近完成一个小项目,里面有个要求,加载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对话框项目下,不行。
在txt里加有中文,则上面的办法就不行了,后来查到说是fgetws会在内部转换,对结果有影响,在开始调用_wfopen前加上setlocale调用,比如
setlocale(LC_ALL, "chs");
_wfopen里的rb改为r,则中文可以,地方语言不行。
后来查到如下代码,问题得到解决:
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"));