使用vc读取unicode文本文件的问题?

dongle2001 2010-09-19 11:39:34

std::string ws2s(const std::wstring& ws)
{
std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
setlocale(LC_ALL, "chs");
const wchar_t* _Source = ws.c_str();
size_t _Dsize = 2 * ws.size() + 1;
char *_Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
std::string result = _Dest;
delete []_Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}

std::string readTxt(char* filename) {
ifstream fin;
fin.open(filename, ios::binary);
size_t index = 2;
std::string strRet;
std::string strLineAnsi;
std::wstring wstrLine;

while (!fin.eof())
{
fin.seekg(index, ios::beg);
wchar_t wch;
fin.read((char *)(&wch), 2);
if (wch == 0x000D) // 判断回车
{
strLineAnsi = ws2s(wstrLine);
wstrLine.erase(0, wstrLine.size() + 1);
index += 4; // 跳过回车符和行开头符
strRet = strRet + strLineAnsi;
}
else
{
wstrLine.append(1, wch);
index += 2;
}
}
strLineAnsi = ws2s(wstrLine);
strRet = strRet + strLineAnsi;

fin.close();
printf("%s", strRet.c_str());
return strRet;
}


我在网上的两个函数可以读取unicode文本保存为ansi格式,但是这个代码有点问题,读取的时候最后一个字符会重复读两次不知道是什么原因,哪位高手帮忙看看是什么问题,帮忙修改一下。
...全文
205 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shi074185 2010-11-23
  • 打赏
  • 举报
回复

if (strLineAnsi!="")
{
strRet=strRet.substr(0,strRet.length()-1);
}

可以解决楼主最后一个字符重复的问题
在此对楼主提供的本段代码表示感谢,我今晚忙了一个晚上,总算是把Unicode中文乱码的问题解决了~
shi074185 2010-11-23
  • 打赏
  • 举报
回复
在std::string readTxt(char* filename) 函数return strRet之前加上如下代码:
//if语句解决文本段末有回车导致最后字符集重复的问题
if (strLineAnsi!="")
{
strRet=strRet.substr(0,strRet.length()-1);
}
Snow_Cold_Wind 2010-09-19
  • 打赏
  • 举报
回复
1楼正解,用Unicode时凡是字符串都写成_T(“”)形式,如_T("很好看")
dongle2001 2010-09-19
  • 打赏
  • 举报
回复
控制台程序,没有mfc。
Eleven 2010-09-19
  • 打赏
  • 举报
回复

try
{
CFile file;
file.Open(_T("F:\\11.txt"), CFile::modeRead);
DWORD len = file.GetLength();
wchar_t* pBuf = new wchar_t[len+1];
memset(pBuf, 0, (len+1)*sizeof(wchar_t));
file.Seek(2, CFile::begin);
file.Read(pBuf, len);
file.Close();

char* pText = NULL;
int size = WideCharToMultiByte(CP_ACP, 0, pBuf, -1, pText, 0, NULL, NULL);
pText = new char[size];
memset(pText, 0, size);
WideCharToMultiByte(CP_ACP, 0, pBuf, -1, pText, size, NULL, NULL);

AfxMessageBox(CString(pText));
file.Open(_T("F:\\12.txt"), CFile::modeCreate|CFile::modeWrite);
file.Write(pText, size);
file.Close();

delete[] pText;
delete[] pBuf;
}
catch (CFileException* e)
{
e->ReportError();
e->Delete();
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧