CFile CString保存UTF-8 UTF8文件格式,相信大家都很讨厌Unicode这个半死不活的编码方式了。
简单说下,Unicode必须占用2个字节,对英文来说就是浪费。所以现在通用的都是UTF8.
我们在MFC用了Unicode编码,那么怎么用CFile保存成UTF8呢?看代码:
// 用完后要释放delete char* char * UnicodeToUtf8(LPWSTR unicode_str,int *uLen) { //预转换,得到所需空间的大小,这次用的函数和上面名字相反 int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, unicode_str, wcslen(unicode_str), NULL, 0, NULL, NULL); //同上,分配空间要给'\0'留个空间 //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存 char* szU8 = new char[u8Len + 1]; //转换 //unicode版对应的strlen是wcslen ::WideCharToMultiByte(CP_UTF8, NULL, unicode_str, wcslen(unicode_str), szU8, u8Len, NULL, NULL); //最后加上'\0' szU8[u8Len] = '\0'; *uLen = u8Len; return szU8; }
然后这样调用:
CString strLog = _T("Log文件,读取时间:") + GetLocalTimeExt(0) + _T("\r\n"); int uLen; char * putf8 = UnicodeToUtf8(strLog.GetBuffer(strLog.GetLength()), &uLen); hLogFile.Write(putf8, uLen); delete putf8;
如何读取UTF8文件呢?反过来啦:
LPWSTR Utf8ToUnicode(char *szU8) { //预转换,得到所需空间的大小 int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0); //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间 LPWSTR wszString = new TCHAR[wcsLen + 1]; //转换 ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen); //最后加上'\0' wszString[wcsLen] = '\0'; return wszString; }
用法依葫芦画瓢就好了。。。