CStdioFile实现完美支持UNICODE方案

飞鸽传书软件在读写文件时,会遇到UNICODE的文件,怎么办呢?这个给大家一个CStdioFile实现完美支持UNICODE方案,先放着以后可能会用到。

// 目标文件路径名称的宏定义   
#define FileURL _T("C://coderui.txt")   

//   
// 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”   
//   
INT _MSBCTo_Unicode(CString strInPut_MSBC, CString *strOutPut_Unicode)   
{   
INT nLen;   
CHAR *pcBuf;   

if(strInPut_MSBC == _T(""))   
{   
   return 0;   
}   

pcBuf = (CHAR *)strInPut_MSBC.GetBuffer(strInPut_MSBC.GetLength());   
nLen = MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, NULL, 0);   

// (Unicode环境WCHAR需要加1,默认已经加1了)   
WCHAR *pwBuf = new WCHAR[nLen];   
memset(pwBuf, 0, nLen);   

MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, pwBuf, nLen);   

strOutPut_Unicode->Format(_T("%s"), pwBuf);   

delete []pwBuf;   

nLen -= 1;   

return nLen;   
}   

//   
// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”   
//   
INT _UnicodeTo_MSBC(CString strInPut_Unicode, CString *strOutPut_MSBC)   
{   
INT nLen;   
WCHAR *pwBuf;   

if(strInPut_Unicode == _T(""))   
{   
   return 0;   
}   

pwBuf = strInPut_Unicode.GetBuffer(strInPut_Unicode.GetLength());   
nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, 0, NULL, NULL);   

// (Unicode环境需要加2,不然Format时内存数据格式不对程序会崩)   
CHAR *pcBuf = new CHAR[nLen + 2];   
memset(pcBuf, 0, nLen + 2);   

WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, pcBuf, nLen, NULL, NULL);   

strOutPut_MSBC->Format(_T("%s"), pcBuf);   

delete []pcBuf;   

nLen -= 1;   

return nLen;   
}   

//   
// 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),   
// 还原为正确的“单字节类型”字符串(_MSBC环境)。   
//   
VOID _UnicodeOf_MSBCTo_MSBC(CString *str)   
{   
INT nLen;   
CHAR *pcBuf;   

nLen = str->GetLength();   

// (Unicode环境需要加3,不然Format时内存数据格式不对程序会崩)   
pcBuf = new CHAR[nLen + 3];   
memset(pcBuf, 0, nLen + 3);   

for (INT i = 0 ; i < nLen; i++)   
{   
   pcBuf = (CHAR)str->GetAt(i);   
}   

str->Format(_T("%s"), pcBuf);   

delete []pcBuf;   
}   

//   
// 使用“CStdioFile”类进行读文件操作   
//   
void StdioReadFile()   
{   
CStdioFile OpenFileR;   
CString str_Unicode,str_MSBC;   

if(!OpenFileR.Open(FileURL, CFile::modeRead))   
{   
   return;   
}   

// 按行来循环读文件   
do   
{   
   // 把“_MSBC环境”下的“CString”(CHAR),直接填充到了“Unicode环境”下的“CString”(WCHAR)中,   
   // 这样会导致“汉字”显示成乱码。如果想正确显示,需要对该字符串进行相应的处理。   
   OpenFileR.ReadString(str_MSBC);   

   if(str_MSBC != _T(""))   
   {   
    // 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),   
    // 还原为正确的“单字节类型”字符串(_MSBC环境)。   
    _UnicodeOf_MSBCTo_MSBC(&str_MSBC);   

    // 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”   
    _MSBCTo_Unicode(str_MSBC, &str_Unicode);   

    AfxMessageBox(str_Unicode);   
   }   
}while(str_MSBC != _T(""));   

OpenFileR.Close();   
}   

//   
// 使用“CStdioFile”类进行写文件操作   
//   
void StdioWriteFile()   
{   
int nLength;   
HANDLE hFile;   
CFileFind pfile;   
CStdioFile OpenFileW;   
CString str_Unicode,str_MSBC;   

if(pfile.FindFile(FileURL, 0))   
{   
   pfile.Close();   

   if(DeleteFile(FileURL))   
   {   
    hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);   
    CloseHandle(hFile);   
   }   
   else   
   {   
    return;   
   }   
}   
else   
{   
   hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);   
   CloseHandle(hFile);   
}   

if(!OpenFileW.Open(FileURL, CFile::modeWrite))   
{   
   return;   
}   

str_Unicode = _T("Coderui您好!/n");   

// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”   
nLength = _UnicodeTo_MSBC(str_Unicode, &str_MSBC);   

OpenFileW.SeekToEnd();   
OpenFileW.Write(str_MSBC, nLength); // 写入“单字节类型的字串符(_MSBC环境)”   
OpenFileW.Close();   

}   

原文:CStdioFile实现完美支持UNICODE方案



你可能感兴趣的:(CStdioFile实现完美支持UNICODE方案)