C++保存文件为UTF8编码格式

本文最后更新于:2021年2月25日 下午

简述

目前在做毕业设计,用 MFC 做一个 OCR 文字识别的客户端程序,其中就涉及到了将数据导出,源码中最常用的字符串类型大概就是 CString ,最主要的原因是它支持中文吧,严格说是支持 Unicode 字符。

关于导出数据这一块,其实就是用 ofstream 来将数据写到文件,CString 也是支持直接写到文件中的,但大概是由于 Visual Studio 的原因默认的编码格式似乎是 GB… 编码,我更想将文件保存为 UTF8 格式,这样就避免了由于字符编码引起的乱码问题~

解决这个问题也就是解决 CString 转 UTF8 ,这里描述的不是很合理(CString 不是编码格式的一种),但能说清楚问题,就不多纠结用词了。

网上有很多关于这个的回答,我自己也是从网上找的,这里就不细说了,轮子直接拿来用即可。

核心函数就一个:WideCharToMultiByte()

代码

标准代码模板如下,两个函数任意调用一个即可:

std::string to_utf8(const wchar_t* buffer, int len)
{
	int nChars = ::WideCharToMultiByte(
		CP_UTF8,
		0,
		buffer,
		len,
		NULL,
		0,
		NULL,
		NULL);
	if (nChars == 0) return "";

	std::string str;
	str.resize(nChars);
	::WideCharToMultiByte(
		CP_UTF8,
		0,
		buffer,
		len,
		const_cast<char*>(str.c_str()),
		nChars,
		NULL,
		NULL);

	return str;
}

std::string to_utf8(const std::wstring& str)
{
	return to_utf8(str.c_str(), (int)str.size());
}

调用方法:

CString s0 = _T("就很棒");
std::string s1 = to_utf8(s0.GetString());