新银。。求教mfc单文档读取带中文文本文件乱码问题

LFENG2 2013-07-15 06:19:35
额。。在仿照win7记事本做一个差不多的记事本。在读取文本文件时出问题了。。如果只有英文的话读取没问题,如果有中文就乱码了。我知道是编码方式的问题,但是不知道该怎么解决。。求教
这是打开文件的代码:

void CTextEditorView::OnFileOpen()
{
CEdit& m_edit = GetEditCtrl();
isModified = m_edit.GetModify();
CString string;
int Choice;
m_edit.GetWindowText(string);
if(isNew && string.IsEmpty());
else if(isModified)
{
Choice = MessageBox(_T("是否将更改保存到 "+CurPath+"?"),_T("记事本"),
MB_YESNO|MB_ICONQUESTION);
if(Choice==IDYES)OnFileSave();
}
CString strText=_T("");
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
CurPath=dlg.GetPathName();
CFile file(CurPath,CFile::modeReadWrite);
char read[50000];
memset(read,0,sizeof(read));
file.Read(read,file.GetLength());
for(unsigned i=0;i<file.GetLength();i++)
strText += read[i];
file.Close();
m_edit.SetFont(&font);
m_edit.SetWindowTextW(strText);
m_edit.SetModify(FALSE);
isNew=FALSE;
}
}

还有一个问题就是,怎么更改ceditview文本输入界面的字体,那字体真心不太好额,貌似还加粗了
...全文
182 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
CStringArray m_TextArray
谢谢哈!不过貌似在vs2012中有问题。。m_TextArray没有add函数,UpdateAllViews(0);这个也没有定义,我用的是vs2012
schlafenhamster 2013-07-15
  • 打赏
  • 举报
回复
CStringArray m_TextArray
LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
上面代码 是 VC6 mbcs
谢谢。。那个m_TextArray是不是CString类型的?
schlafenhamster 2013-07-15
  • 打赏
  • 举报
回复
上面代码 是 VC6 mbcs
schlafenhamster 2013-07-15
  • 打赏
  • 举报
回复

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);
		}
	}
}

LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
“在读取文本文件时” 要知道 编码是 什么: 查文件头几个字节: /* 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. */
大神能说得详细些么?
schlafenhamster 2013-07-15
  • 打赏
  • 举报
回复
“在读取文本文件时” 要知道 编码是 什么: 查文件头几个字节: /* 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. */
LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
char read[50000];
memset(read,0,sizeof(read));

--- 用wchar数组

还是乱码。。额
LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
char read[50000]; memset(read,0,sizeof(read)); --- 用wchar数组
啊。。我智商拙计了,写错了
LFENG2 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
char read[50000];
memset(read,0,sizeof(read));

--- 用wchar数组


谢谢版版。。额,报错了,是不是还要加头文件什么的?
oyljerry 2013-07-15
  • 打赏
  • 举报
回复
char read[50000]; memset(read,0,sizeof(read)); --- 用wchar数组

16,472

社区成员

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

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

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