Skip to content

Instantly share code, notes, and snippets.

@rosasurfer
Last active April 30, 2026 11:37
Show Gist options
  • Select an option

  • Save rosasurfer/ec3bfcd2974a065fd56231de2d70bda8 to your computer and use it in GitHub Desktop.

Select an option

Save rosasurfer/ec3bfcd2974a065fd56231de2d70bda8 to your computer and use it in GitHub Desktop.
Encoding conversion in C++
// Convert a UTF-16 string to an ANSI string.
std::string utf16ToAnsi(const std::wstring &wstr) {
int length = static_cast<int>(wstr.length());
if (!length) return std::string();
DWORD flags = WC_NO_BEST_FIT_CHARS;
int bufSize = WideCharToMultiByte(CP_ACP, flags, &wstr[0], length, NULL, 0, NULL, NULL);
if (bufSize > 0) {
std::string strTo(bufSize, 0);
WideCharToMultiByte(CP_ACP, flags, &wstr[0], length, &strTo[0], bufSize, NULL, NULL);
return strTo;
}
return std::string();
}
// Convert a UTF-16 string to an UTF-8 string.
std::string utf16ToUtf8(const std::wstring &wstr) {
int length = static_cast<int>(wstr.length());
if (!length) return std::string();
DWORD flags = WC_ERR_INVALID_CHARS;
int bufSize = WideCharToMultiByte(CP_UTF8, flags, &wstr[0], length, NULL, 0, NULL, NULL);
if (bufSize > 0) {
std::string strTo(bufSize, 0);
WideCharToMultiByte(CP_UTF8, flags, &wstr[0], length, &strTo[0], bufSize, NULL, NULL);
return strTo;
}
return std::string();
}
// Convert a UTF-8 string to a UTF-16 string.
std::wstring utf8ToUtf16(const std::string &str) {
int length = static_cast<int>(str.length());
if (!length) return std::wstring();
DWORD flags = MB_ERR_INVALID_CHARS;
int bufSize = MultiByteToWideChar(CP_UTF8, flags, &str[0], length, NULL, 0);
if (bufSize > 0) {
std::wstring wstrTo(bufSize, 0);
MultiByteToWideChar(CP_UTF8, flags, &str[0], length, &wstrTo[0], bufSize);
return wstrTo;
}
return std::wstring();
}
// Convert a UTF-8 string to an ANSI string.
std::string utf8ToAnsi(const std::string &str) {
return utf16ToAnsi(utf8ToUtf16(str));
}
// Convert an ANSI string to a UTF-16 string.
std::wstring ansiToUtf16(const std::string &str) {
int length = static_cast<int>(str.length());
if (!length) return std::wstring();
DWORD flags = MB_ERR_INVALID_CHARS;
int bufSize = MultiByteToWideChar(CP_ACP, flags, &str[0], length, NULL, 0);
if (bufSize > 0) {
std::wstring wstrTo(bufSize, 0);
MultiByteToWideChar(CP_ACP, flags, &str[0], length, &wstrTo[0], bufSize);
return wstrTo;
}
return std::wstring();
}
// Convert an ANSI string to a UTF-8 string.
std::string ansiToUtf8(const std::string &str) {
return utf16ToUtf8(ansiToUtf16(str));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment