VC 编程ANSI环境下读写Unicode文件

VC 编程ANSI环境下读写Unicode文件
2009-02-26 15:14

       没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬!
       关于ANSI和Unicode编码的原理在这里也不说了,主要讲下如何读写!
       首先确定你的工程是采用的是什么编码环境,默认是ANSI,不同的字符集读写文件的差别也比较大,我这里只在ANSI环境下做的,下一步在探索在Unicode环境下如何读写!(原先这个没搞懂,读了不少代码发现自己试验都是有误的)。
       在ANSI的字符集下,CString等都是单字节版本的,所以一定要注意。而多要读取的Unicode文件却是双字节的,这里就要转换了,当然在ANSI字符集下,还是用二进制的方式打开Unicode文件,自己判断是否是换行,在转化成ANSI编码。而在写Unicode的时候,先将所字符转化成Unicode编码再写入,而且在写文件之前一定要加上Unicode文件的标识。
下面是读
   CFile mFile(UnicodefilePath,CFile::modeRead);
   byte head[2];
   mFile.Read(head,2);  
   if((head[0]==0xff&&head[1]==0xfe)||(head[0]==0xfe&&head[1]==0xff)   )
   {
    //AfxMessageBox(_T("File is Unicode!"));
    isUnicode = true;
   }
if(isUnicode) mFile.Seek(2,CFile::begin);//0xfffe
wchar_t wch;
wchar_t wstr[300];

CString strvalue ;
hile(mFile.Read((char *)&wch,2)>0)
{
   if(wch==0x000D)//by line
   {
    //chang to ansi
    int nLen = i;
    char *buf = new char[2*nLen];
    WideCharToMultiByte(CP_ACP, 0, wstr, nLen, buf, 2*nLen, NULL, NULL);
    buf[2*nLen-1] = 0; //some assertion failed,这个比较重要,小问题可以折腾人啊
   strvalue = buf;
    mFile.Seek(2,CFile::current);//跳过行开头符号
    i=0;
}
   else
   {
    wstr[i++] = wch;
   }
}
//下面是写
CStdioFile transFile;
transFile.Open(strUnicodeSavepath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
WORD wSignature = 0xFEFF;
transFile.Write(&wSignature, 2);//Unicode的文件符号
   CHAR *pszAnsi = new TCHAR[strvalue.GetLength()+1];
   _tcscpy(pszAnsi, strvalue);
   WCHAR * szwBuffer = new WCHAR[strvalue.GetLength()+1];
   MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, szwBuffer, strvalue.GetLength()+1);
   //write to files
   transFile.Write(szwBuffer, lstrlenW(szwBuffer) * sizeof(WCHAR));
当然你可以把你的工程设置成Unicode的字符集,这个时候在Unicode的工程下读取ANSI文件又是一个烦人的事情,讲文件读到CString中的时候,每个单字节的ANSI被转成了双字节,需要自己来处理,后面我再探索探索再来记录。


原文链接: http://blog.csdn.net/augusdi/article/details/4677528

你可能感兴趣的:(VC 编程ANSI环境下读写Unicode文件)