所有的格式都可以直接用UE之类的工具查看Unicode,unicoidebig,Asci,UTF8四种格式,在文本导入时,
CFile file(fileDlg.GetFileName(),CFile::modeRead); LPSTR pBuf; DWORD dwFileLen; dwFileLen=file.GetLength(); pBuf=new char[dwFileLen+2]; pBuf[dwFileLen]=0; pBuf[dwFileLen+1]=0; file.Read(pBuf,dwFileLen);
之所以+2,是考虑到用unicode时,是两个字节一读,所以结束符必须为两个字节都为0x00;用Uedit32打开就知道,unicode前两个多余字节是0xff,oxfe.后接unicode编缉
unicode big的前两个多余字节是0xfe,0xff.因为unide是两个字节一存,unicode big就是所有的这两个字节的位置互换utf-8的前三个多余字节是0xef,0xbb,0xbf.
直接贴代码:
CFile file(m_szPath,CFile::modeRead); LPSTR pBuf; DWORD dwFileLen; dwFileLen=file.GetLength(); pBuf=new char[dwFileLen+2]; pBuf[dwFileLen]=0; pBuf[dwFileLen + 1] = 0; file.Read(pBuf,dwFileLen); CString szText ; const byte *pHead = (const byte *)pBuf; if (*pHead == 0xEF && *(pHead + 1) == 0xBB && *(pHead + 2) == 0xBF)//如果是utf8,就去掉前面的三个字节 { int m_nLen=MultiByteToWideChar(CP_UTF8,0,pBuf + 3,-1,0,NULL); wchar_t *strChar=new wchar_t[m_nLen+1]; strChar[m_nLen]=0 ; MultiByteToWideChar(CP_UTF8,0,pBuf + 3,-1,strChar,m_nLen); CString str(strChar); szText = str ; delete[]strChar; strChar = NULL ; } else if (*pHead==0xFF &&*(pHead+1)==0xFE)//unicode { CString str((LPCTSTR)(pBuf + 2)); szText = str ; } else if (*pHead==0xFE &&*(pHead+1)==0xFF)//unicode big { for(int i=0;i<dwFileLen;i+=2) { char temp; temp=pBuf[i]; pBuf[i]=pBuf[i+1]; pBuf[i+1]=temp; } CString str((LPCTSTR)(pBuf + 2)); szText=str; } else//asci { int m_nLen=MultiByteToWideChar(CP_ACP,0,pBuf,-1,0,NULL); wchar_t *strChar=new wchar_t[m_nLen]; memset(strChar,0,m_nLen) ; MultiByteToWideChar(CP_ACP,0,pBuf,-1,strChar,m_nLen); CString str(strChar); szText=str; delete[]strChar; strChar = NULL ; } delete[]pBuf; pBuf = NULL ;
得到的szText就是所需.
当然,
一般导出的txt文件如果要导出成unicode,unicode big时,要注意以下几点
1、要将字符串转成UNICODE编码。
2、换行要使用_T("/r/n")。
3、如果需要被其他程序或编辑器识别,
2、如果需要被其他程序或编辑器识别,
unicode需要在文件头加上0xFF 0xFE
unicode big需要在文件头加上0XFE 0XFF
一般导出的txt文件如果要导出成utf-8,asci时,要注意以下几点
1、要将字符串转成多字节编码。
utf-8需要在文件头加上0XEF 0XBB 0XBF.
去年五月份写的,太乱了,更新下.