diff --git a/src/shared/Auth/OpenSSLProvider.cpp b/src/shared/Auth/OpenSSLProvider.cpp index 90db11701..babe88fda 100644 --- a/src/shared/Auth/OpenSSLProvider.cpp +++ b/src/shared/Auth/OpenSSLProvider.cpp @@ -161,18 +161,25 @@ bool ConvertWideToAnsi(const std::wstring& value, std::string& converted) if (value.empty()) return false; + constexpr UINT GB18030_CODE_PAGE = 54936; + UINT const codePage = GetACP(); + bool const restrictedCodePage = + codePage == CP_UTF8 || codePage == GB18030_CODE_PAGE; + DWORD const flags = restrictedCodePage ? + WC_ERR_INVALID_CHARS : WC_NO_BEST_FIT_CHARS; BOOL usedDefault = FALSE; + BOOL* usedDefaultPointer = restrictedCodePage ? nullptr : &usedDefault; int required = WideCharToMultiByte( - CP_ACP, WC_NO_BEST_FIT_CHARS, value.c_str(), -1, - nullptr, 0, nullptr, &usedDefault); + codePage, flags, value.c_str(), -1, + nullptr, 0, nullptr, usedDefaultPointer); if (required <= 0 || usedDefault) return false; std::vector buffer(static_cast(required)); usedDefault = FALSE; int written = WideCharToMultiByte( - CP_ACP, WC_NO_BEST_FIT_CHARS, value.c_str(), -1, - buffer.data(), required, nullptr, &usedDefault); + codePage, flags, value.c_str(), -1, + buffer.data(), required, nullptr, usedDefaultPointer); if (written <= 0 || usedDefault) return false;