MFC Unicode 專案內部使用 UTF-16 (wchar_t/CString),直接讀取 UTF-8 檔案會導致中文亂碼。
CString ReadUtf8File(LPCTSTR filePath)
{
CFile file;
if (!file.Open(filePath, CFile::modeRead | CFile::typeBinary))
return _T("");
DWORD fileSize = (DWORD)file.GetLength();
std::vector<BYTE> buffer(fileSize);
file.Read(buffer.data(), fileSize);
file.Close();
// UTF-8 -> UTF-16
int wlen = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)buffer.data(), fileSize, NULL, 0);
std::vector<wchar_t> wbuf(wlen);
MultiByteToWideChar(CP_UTF8, 0, (LPCCH)buffer.data(), fileSize, wbuf.data(), wlen);
return CString(wbuf.data(), wlen);
}
CStdioFile file;
file.Open(filePath, CFile::modeRead | CFile::typeBinary);
CStringA line;
CString content;
while (file.ReadString(line)) {
int wlen = MultiByteToWideChar(CP_UTF8, 0, line, line.GetLength(), NULL, 0);
CStringW wline;
MultiByteToWideChar(CP_UTF8, 0, line, line.GetLength(), wline.GetBuffer(wlen), wlen);
wline.ReleaseBuffer(wlen);
content += wline + _T("\r\n");
}
file.Close();
WideCharToMultiByte(CP_UTF8, ...)。Microsoft 官方討論串:MFC UTF-8 讀寫完整範例