586, спасибо, работает. Я понял, где у меня была ошибка: Надо было вместо:
Код | std::wstring sAnsiToUtf8(const std::string &csAnsiStr) { ...
|
написать:
Код | std::string sAnsiToUtf8(const std::string &csAnsiStr) { ...
|
Вот тоже рабочий код (хотя с буферами нехорошо будет):
Код | //--------------------------------------------------------------------------- //TODO: + sAnsiToUtf8 /* convert input ANSI string to widechar using MultiByteToWideChar(CP_ACP, ...) function (CP_ACP is current Windows system Ansi code page) convert output widechar string from previous call to UTF-8 using WideCharToMultiByte(CP_UTF8, ...) function */
std::string sAnsiToUtf8(const std::string &csAnsiStr) { CHAR szUtf [1024] = {0}; WCHAR wszTemp[1024] = {0};
INT iSize = 0; INT iMultiByteSize = 0;
iSize = ::MultiByteToWideChar(CP_ACP, 0, csAnsiStr.c_str(), csAnsiStr.size(), NULL, 0); /*DEBUG*/XASSERT_RET(0 < iSize, std::string()); iSize = ::MultiByteToWideChar(CP_ACP, 0, csAnsiStr.c_str(), csAnsiStr.size(), wszTemp, iSize); /*DEBUG*/XASSERT_RET(0 < iSize, std::string());
iMultiByteSize = ::WideCharToMultiByte(CP_UTF8, 0, wszTemp, iSize, NULL, 0, NULL, NULL); /*DEBUG*/XASSERT_RET(0 < iMultiByteSize, std::string());
iMultiByteSize = ::WideCharToMultiByte(CP_UTF8, 0, wszTemp, iSize, szUtf, iMultiByteSize, NULL, NULL); /*DEBUG*/XASSERT_RET(0 < iMultiByteSize, std::string());
//szUtf[iMultiByteSize] = '\0'; //return (LPCWSTR)&szUtf[0];
std::string sRes = szUtf;
//return (LPCWSTR) (& (std::string(szUtf, iMultiByteSize).at(0)));
return &szUtf[0]; } //--------------------------------------------------------------------------- //TODO: + sUtf8ToAnsi /* convert input UTF-8 string to widechar using MultiByteToWideChar(CP_UTF8, ...) function convert output widechar string from previous call to ANSI using WideCharToMultiByte(CP_ACP, ...) function (CP_ACP is current Windows system Ansi code page) */ std::string sUtf8ToAnsi(const std::string &csUtf8Str) { //norm - входная строка //utf- выходная CHAR szUtf [1024] = {0}; WCHAR wszTemp[1024] = {0};
INT iSize = 0; INT iMultiByteSize = 0;
iSize = ::MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)csUtf8Str.data(), csUtf8Str.size(), NULL, 0); /*DEBUG*/XASSERT_RET(0 < iSize, std::string());
iSize = ::MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)csUtf8Str.data(), csUtf8Str.size(), wszTemp, iSize); /*DEBUG*/XASSERT_RET(0 < iSize, std::string());
iMultiByteSize = ::WideCharToMultiByte(CP_ACP, 0, wszTemp, iSize, NULL, 0, NULL, NULL); /*DEBUG*/XASSERT_RET(0 < iMultiByteSize, std::string());
iMultiByteSize = ::WideCharToMultiByte(CP_ACP, 0, wszTemp, iSize, szUtf, iMultiByteSize, NULL, NULL); /*DEBUG*/XASSERT_RET(0 < iMultiByteSize, std::string());
return std::string(szUtf, iMultiByteSize); } //---------------------------------------------------------------------------
|
|