首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC CSV 寫入中文亂碼:setlocale 設置本地化解決 Unicode 編碼問題

     編輯:程式設計綜合問答

問題原因

VS2013 默認 Unicode 字符集,CString 為 wchar_t。直接用 CStdioFile::WriteString 或流操作符寫入 CSV,若文件流未設置正確 locale,中文會按當前代碼頁 (CP936/GBK) 寫入,導致 Excel 打開亂碼或存儲為 UTF-16 無法識別。

解決方案:設置 C 本地化環境

// 保存原 locale
char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));
// 設置為中文簡體 (CP936)
setlocale(LC_CTYPE, "chs"); // 或 "zh_CN.GBK", ".936"

// 執行文件寫入操作
CStdioFile file;
file.Open(_T("data.csv"), CFile::modeCreate | CFile::modeWrite | CFile::typeText);
file.WriteString(_T("姓名,年齡\n"));
file.WriteString(_T("張三,25\n"));
file.Close();

// 恢復 locale
setlocale(LC_CTYPE, old_locale);
free(old_locale);

原理

  • setlocale(LC_CTYPE, "chs") 將 C 運行庫的字符轉換設置為 GBK (代碼頁 936)。
  • CStdioFile::WriteString 內部調用 fwrite,會將 wchar_t 按當前 locale 轉為多字節寫入。
  • Excel 默認按系統 ANSI 代碼頁 (中文系統為 GBK) 打開 CSV,故編碼一致即可正常顯示。

替代方案:UTF-8 BOM

file.Open(_T("data.csv"), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
// 寫入 UTF-8 BOM
BYTE bom[] = {0xEF, 0xBB, 0xBF};
file.Write(bom, 3);
// 手寫 UTF-8 編碼轉換
CStringA utf8 = CW2A(str, CP_UTF8);
file.WriteString(utf8);

優點:跨平台通用,支援所有語言。缺點:需手動轉碼,Excel 2016+ 才完美支援無 BOM UTF-8。

最佳實踐

  1. 國內項目、僅 Excel 查看:用 setlocale("chs") + GBK 最省事。
  2. 跨平台/多語言/現代 Excel:用 UTF-8 BOM。
  3. 避免在 Unicode 專案中直接用 CArchive 寫文本,CArchive 為二進制序列化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved