案例一: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