在MFC中,如何將Unicode的CString中文字元寫入文字檔案TXT中
阿新 • • 發佈:2019-02-06
在看了這個論壇後,我也想嘗試一下,如何把Unicode中文寫到txt檔案中。
很明顯,我可以輕易的把CStringW轉換成char*然後寫入txt(不用擔心中文會變成亂碼),但是我沒有這麼做。
因為解決問題的方法太多了,我們總是想著最簡單的那一種。
首先,地區語言設定很重要。
#include <locale.h>
_wsetlocale(LC_ALL,L"chs"); //設定成中文
其次,(與上面論壇的方法有些差別,因為我不是在MFC中,而是在WTL中,這就要求儘量不用MFC dll,因此我放棄了CStdioFile,這個類只支援char*)
所以我選擇了最原始的C的方法(也許C++中也有與fstream對應的unicode版本,的確是有的wofstream,但是很遺憾,這個函式在遇到中文時就停止繼續輸出後面的文字了)
// 日誌檔案,寫入unicode中文 class LogFile { public: LogFile() { fp = NULL; } bool Open(const char* path) { fopen_s(&fp,path,"a+"); //以追加方式寫入,檔案不存在時,會自動建立 if(fp == NULL) { perror("fopen_s a+ : "); return false; } return true; } bool WriteString(CStringW str) { UStrToWChar wchar(str); //這個是將CStringW轉換成wchar_t*,因為我不放心GetBuffer函式。這個類在上面提到的文章中可以看到 int len = wcslen(&wchar); //求出寬字元個數 int n = fwprintf_s(fp,L"%s",&wchar); //這個函式就是用來寫寬字元的 if(n == len) return true; else { perror("fwprintf_s : "); Close(); return false; } } void Close() { if(fp != NULL) { fclose(fp); fp = NULL; } } private: FILE* fp; };
測試程式碼:
LogFile file;
if(file.Open("log.txt"))
{
CStringW str = L"This is 中文 words test \r\n";
CStringW str2 = L"More Words 中文ING";
bool need_close = false;
if(file.WriteString(str))
{
if(file.WriteString(str2))
need_close = true;
}
if(need_close)
file.Close();
}
程式結果圖: