1. 程式人生 > >在MFC中,如何將Unicode的CString中文字元寫入文字檔案TXT中

在MFC中,如何將Unicode的CString中文字元寫入文字檔案TXT中

在看了這個論壇後,我也想嘗試一下,如何把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();
	}

程式結果圖: