我程序是使用VC2008开发的默认的是Unicode的。
读取txt文件如果是Unicode的话就不会乱码。
但是读取UTF-8或者ANSI的都会乱码...
这种问题怎么解决?是不是要转编码。
还是写两种读取的代码。如果文件是Unicode就用Unicode的读。如果是ANSI的就用ANSI的标准读
读取txt文件如果是Unicode的话就不会乱码。
但是读取UTF-8或者ANSI的都会乱码...
这种问题怎么解决?是不是要转编码。
还是写两种读取的代码。如果文件是Unicode就用Unicode的读。如果是ANSI的就用ANSI的标准读
解决方案 »
- 点击窗口最大化调用onsize的问题
- 删除大量文件的时候会死机是怎么回事?
- 编辑框、组合框,在没有输入数据前的提示输入信息如“请输入XXX”点击后消失,是怎么做的?
- 一个大学生的感慨:从招聘看中国软件业
- 在PutCollect中如何转换char型变量?
- 有谁用天敏的SDK做过开发?小弟头晕呀…………
- 4行程式,却有一个摸不着的错误,好迷惑不解....
- 急!!谁能告诉我TurboC2.0在哪有得下载啊(我没分了...^_^)(在线等!!)
- 谁看了《程序员大本营2001--微软版》?想买了……
- 高分求助!怎么把wave文件播放到Modem中去?
- 如何在DLL中关闭DLL
- vc多文档程序:文件在后台被修改,如何在视图中更新该文件
读取文件的方式无需区分
读取后,
1、解析BOM,就是文件数据的前2-3个字节,确定文本编码类型:ansi,utf-8,unicode(big or little)
2、根据需要对于文本数据进行编码转换后再使用
{// 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);
}
注意,其默认目标编码为ansi(GBK)BOOL CCSVHlpr::DoInit(LPCTSTR pszFileName,int iField)
{
CFile f;
if(!f.Open(pszFileName,CFile::modeRead))
{
_tcscpy(m_szLastError,_T("文件打开错误。"));
return FALSE;
}
int n = f.GetLength();
if(n > MAX_CSV_LEN)
{
f.Close();
_stprintf(m_szLastError,_T("文件太大,超过%d 字节。"),MAX_CSV_LEN);
return FALSE;
}
m_pszData = new char[n+2];
if(m_pszData == NULL)
{
f.Close();
_tcscpy(m_szLastError,_T("内存不足(文件太大?)。"));
return FALSE;
}
ZeroMemory(m_pszData,n+2);
f.ReadHuge(m_pszData,n);
f.Close();
BYTE *p=(BYTE *)m_pszData;
if(p[0] == 0xEF && p[1] == 0xBB && p[2] == 0xBF)
{
//UTF-8
strcpy(m_pszData,m_pszData+3);
CCPConvert::UTF82Ansi(m_pszData);
}
else if((p[0] == 0xFF && p[1] == 0xFE) || (p[0] == 0xFE && p[1] == 0xFF))
{
//--UNICODE --XX00XX00--Litle Endian
//--UNICODE --00XX00XX--Big Endian
WCHAR *pw = (WCHAR *)m_pszData;
char *psz = new char[n+2];
memset(psz,'\0',n+2);
CCPConvert::Unicode2Ansi(pw+1,psz);
strcpy(m_pszData,psz);
delete psz;
}
m_pszCur = m_pszData;
//-- pars fields
//char *b=m_pszData; return TRUE;}