CFile CString保存、读取UTF-8 UTF8文件格式

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;
}

用法依葫芦画瓢就好了。。。

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com