使用CEditView将界面文字保存成txt格式,文字乱码???

lionpl 2011-10-15 12:52:34
CEdit &edit =pView->GetEditCtrl();
int i, nLineCount = edit.GetLineCount(); //获得视图中数据的行数
CString strText;
CString szBuffer = _T("");
for(i = 0; i<nLineCount; i++) //逐行获得视图中数据,添加到文件
{
int len = edit.LineLength(edit.LineIndex(i)); //获得视图中一行数据长度
edit.GetLine(i, strText.GetBuffer(len), len); //获得视图中的一行数据
strText.ReleaseBuffer(len);
szBuffer.Format(_T("%s\r\n"),strText); //将数据按一定格式写入szBuffer
AFXDUMP(szBuffer);
arStore.WriteString(szBuffer); //将数据写入文件
}

使用VS2008,视图继承的是CEditView,主要代码如上所示,调试没有任何问题,且szBuffer中都能够获得视图中的数据,但是保存成txt文件后,视图中的中文文字全部乱码。
注:在网上搜索了原因,主要还是因为VS2008使用的是Unicode,需要使用MultiByteToWideChar()函数来进行转换,请问各位大侠,对于我这个程序应该怎么转换呢,在线等!!!!!!!
...全文
234 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-10-15
  • 打赏
  • 举报
回复
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
lionpl 2011-10-15
  • 打赏
  • 举报
回复
自己搞定了,多谢哈,给分!!!
schlafenhamster 2011-10-15
  • 打赏
  • 举报
回复
末尾都出现一行??????????,用UE看看是什么,是不是串长度有问题?
lionpl 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 schlafenhamster 的回复:]
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
[/Quote]
谢谢你的回答,我提取了你程序中的一小段代码,
但是现在输出的每一行文字末尾都出现一行??????????,请问这个应该怎么解决呢?
schlafenhamster 2011-10-15
  • 打赏
  • 举报
回复

// CEditStringDoc serialization
void CEditStringDoc::Serialize(CArchive& ar)
{
BOOL FirstLine=TRUE;
WCHAR wBuf[2048];
char szBuf[2048];
int i=0;
BOOL LineEnd=FALSE;
char type[10];
char dummy[10];
char *pLine=0;
char UniHead[4]={(char)0xEF,(char)0xBB,(char)0xBF,(char)0};
char UtfHead[3]={(char)0xFF,(char)0xFE,(char)0};
/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
CFile *pFile=ar.GetFile();
CString name=pFile->GetFileTitle();//
if((name.Find(".htm")==-1) && (name.Find(".txt")==-1))
{
AfxMessageBox("Only suports *.htm or *.txt files!");
return;
}
//
memset(type,0,10);
memset(dummy,0,10);
//
if (ar.IsStoring())
{
// TODO: add storing code here
int all=m_TextArray.GetSize();
for (int kk=0;kk<all;kk++)
{
strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
strcat(szBuf,"\r\n");
if(FirstLine)
{
if (m_UTF8) ar.Write(UniHead,3);
else if (m_UNICODE) ar.Write(UtfHead,2);
}// end 1st line
if(m_UTF8)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
ar.Write(szBuf,strlen(szBuf));
}
if(m_UNICODE)
{
MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
ar.Write(wBuf,2*wcslen(wBuf));
}
else
{
ar.Write(szBuf,strlen(szBuf));
}
FirstLine=FALSE;
}// end for
}// end save
else
{// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
// if UNICODE file the 1st 2 chars are :FFh,FEh
// TODO: add loading code here
m_TextArray.RemoveAll();
memset(szBuf,0,sizeof(szBuf));
while(ar.Read(&szBuf[i],1))
{//
if(FirstLine)
{
if( (szBuf[0]!=(char)0xEF) &&
(szBuf[0]!=(char)0xBB) &&
(szBuf[0]!=(char)0xBF) &&
(szBuf[0]!=(char)0xFF) &&
(szBuf[0]!=(char)0xFE) )
{// normal file
m_UTF8=FALSE;
m_UNICODE=FALSE;
FirstLine=FALSE;
i++;
continue;
}
if( szBuf[0]==(char)0xEF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBB)
{
type[1]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xBF)
{
type[2]=szBuf[0];
}
// Is UTF8 file ?
if( (type[0]==(char)0xEF) &&
(type[1]==(char)0xBB) &&
(type[2]==(char)0xBF) )
{// UTF8 file
m_UTF8=TRUE;
m_UNICODE=FALSE;
FirstLine=FALSE;
continue;//i=0
}
// Is UNICODE file ?
if( szBuf[0]==(char)0xFF)
{
type[0]=szBuf[0];
continue;
}
if( szBuf[0]==(char)0xFE)
{
type[1]=szBuf[0];
}
if( (type[0]==(char)0xFF) &&
(type[1]==(char)0xFE) )
{
m_UNICODE=TRUE;
m_UTF8=FALSE;
FirstLine=FALSE;
continue;//i=0
}
}// end firstline
// check line end
if(szBuf[i]==0x0D)
{//
LineEnd=TRUE;
szBuf[i]=0;
ar.Read(dummy,1);//00 or 0a
if(m_UNICODE)
{
szBuf[i+1]=0;
ar.Read(dummy,2);//0a 00
}
}
//
if(LineEnd)
{
if(m_UTF8)
{// utf8 file
MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
pLine=szBuf;
}
else if(m_UNICODE)
{// Unicode file
WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
pLine=(char *)wBuf;
}
else
{// normal file
pLine=szBuf;
}
LineEnd=FALSE;// new line
i=-1;// +1=0 szBuf[0]
//add
m_TextArray.Add(pLine);
memset(szBuf,0,sizeof(szBuf));
}// end LineEnd
i++;//from 0
}// end while
// if file end but no LF
if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line
if(m_TextArray.GetSize()!=0)
{
UpdateAllViews(0);
}
}
}

注意文件前面要有几个字节,表示文件编码。
/*
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
lionpl 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xyh79639981 的回复:]
这问题我也遇到过,你吧缓冲区用char * d的,用Cstring就会乱码,你改后试试,应该可以解决的!
[/Quote]
我刚试着改了一下好像还是不行诶,能否给一小段代码看看。
xyh79639981 2011-10-15
  • 打赏
  • 举报
回复
这问题我也遇到过,你吧缓冲区用char * d的,用Cstring就会乱码,你改后试试,应该可以解决的!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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