字符編碼轉換

案例一:C++裏流文件讀取字符串時產生的各種不確定編碼問題

wstring strFilePath;
strFilePath = strResourcePath + _T("lang\\") + FindFileData.cFileName;

ifstream OpenFile(strFilePath);
if(OpenFile.fail()) continue;

在流文件讀取的時候,編碼轉換很容易出錯,解決方法就是不要使用這種辦法讀取

案例二:編碼具體轉換

wstring CSettingCenter::UTF8ToGB(const char * strText)
{
	string result;
	WCHAR *strSrc;
	LPSTR szRes;

	//獲得臨時變量的大小
	int i = MultiByteToWideChar(CP_UTF8, 0, strText, -1, NULL, 0);
	strSrc = new WCHAR[i + 1];
	MultiByteToWideChar(CP_UTF8, 0, strText, -1, strSrc, i);

	//獲得臨時變量的大小
	i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
	szRes = new CHAR[i + 1];
	WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);

	result = szRes;
	delete[]strSrc;
	delete[]szRes;

	return (CA2W)result.c_str();
}

此方法轉換過程中比較繁雜 

案例三 :最好的解決辦法CA2WEX<>(sep, CP_UTF8)轉

 

strFilePath = CPaintManagerUI::GetResourcePath() + _T("lang\\") + FindFileData.cFileName;

		HANDLE hFile = ::CreateFileW(strFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile == INVALID_HANDLE_VALUE)
		{
			break;
		}

		DWORD dwSize = ::GetFileSize(hFile, NULL);
		if (!dwSize)
		{
			CloseHandle(hFile);
			break;
		}
		pLanguageData = new CHAR[dwSize + 1];
		DWORD dwRead = 0;
		::ReadFile(hFile, pLanguageData, dwSize, &dwRead, NULL);
		dwLanguageDataSize = dwRead;
		CloseHandle(hFile);

		vector<wstring> vctText;
		vctTemp.clear();

		if (!pLanguageData) return;

		char* next_start = pLanguageData;
		
		char* start = next_start;
		char* end = strchr(start, '\n');
		if (end)
		{
			*end = 0;
		}

		char* sep = strchr(start, '=');
		if (!sep)
		{
			continue;
		}
		*sep = 0;
		sep++;
		
		wstring value = CA2WEX<>(sep, CP_UTF8);

案例四 用C語言發FILE fopen打開問文件,或者MFC的CFile方法打開

 

 

深圳Duilib交流羣332584099
深圳C++交流羣876027056

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章