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

CString 作為檔名存檔出現亂碼:結束符 \0 缺失、緩衝區長度不足、編碼不匹配

     編輯:程式設計疑難解答

三大常見原因

原因現象排查方法
缺少結束符 \0檔名後附帶隨機字元檢視 CString::GetBuffer() 返回指標,strlen 實際長度是否超過邏輯長度
緩衝區長度不足截斷或寫入越界CFileDialog 的 m_ofn.nMaxFile 預設 260 (MAX_PATH),長路徑需手動擴大
Unicode/ANSI 混用中文檔名亂碼專案屬性 → 字元集:Unicode 統一;CString 內部為 wchar_t,GetBuffer 返回 LPWSTR

正確使用 CFileDialog 獲取/設定檔名

CFileDialog dlg(FALSE, _T("txt"), _T("默認檔名.txt"),
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    _T("文字檔 (*.txt)|*.txt|所有檔 (*.*)|*.*||"));

 // 擴大緩衝區支援長路徑 (Windows 10 1607+ 支援長路徑)
dlg.m_ofn.nMaxFile = 32768; // 32K
TCHAR* bigBuf = new TCHAR[dlg.m_ofn.nMaxFile];
dlg.m_ofn.lpstrFile = bigBuf;
dlg.m_ofn.lpstrFile[0] = _T('\0');

if (dlg.DoModal() == IDOK) {
    CString fileName = dlg.GetPathName(); // 自動處理 \0
    // 存檔邏輯...
}
delete[] bigBuf;

CString 存檔名最佳實踐

  1. 統一 Unicode 字元集:專案屬性 → General → Character Set = Use Unicode Character Set。
  2. 用 GetPathName() 而非 GetFileName():前者含完整路徑,後者僅檔名,存檔需完整路徑。
  3. 長路徑支援:清單檔 <longPathAware>true</longPathAware> (Win10 1607+),並擴大 nMaxFile。
  4. 檔名合法性過濾:移除 \ / : * ? " < > | 等非法字元。

總結

CString 檔名亂碼 90% 因**缺 \0、緩衝區太小、編碼不統一**。統一 Unicode、擴大 nMaxFile、用 GetPathName()、檢查結束符,即可徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved