You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.8 KiB
C++
61 lines
1.8 KiB
C++
#include "encoding.h"
|
|
|
|
#include <Windows.h>
|
|
|
|
namespace {
|
|
|
|
// Wrapper for Windows API MultiByteToWideChar.
|
|
std::wstring MB2WC(const std::string& input, unsigned int code_page) {
|
|
if (input.empty()) {
|
|
return L"";
|
|
}
|
|
|
|
int length = ::MultiByteToWideChar(code_page, 0, &input[0],
|
|
static_cast<int>(input.size()),
|
|
NULL, 0);
|
|
|
|
std::wstring output(length, '\0');
|
|
|
|
::MultiByteToWideChar(code_page, 0, &input[0], static_cast<int>(input.size()),
|
|
&output[0], static_cast<int>(output.size()));
|
|
|
|
return output;
|
|
}
|
|
|
|
// Wrapper for Windows API WideCharToMultiByte.
|
|
std::string WC2MB(const std::wstring& input, unsigned int code_page) {
|
|
if (input.empty()) {
|
|
return "";
|
|
}
|
|
|
|
// There do have other code pages which require the flags to be 0, e.g.,
|
|
// 50220, 50211, and so on. But they are not included in our charset
|
|
// dictionary. So, only consider 65001 (UTF-8) and 54936 (GB18030).
|
|
DWORD flags = 0;
|
|
if (code_page != 65001 && code_page != 54936) {
|
|
flags = WC_NO_BEST_FIT_CHARS | WC_COMPOSITECHECK | WC_DEFAULTCHAR;
|
|
}
|
|
|
|
int length = ::WideCharToMultiByte(code_page, flags, &input[0],
|
|
static_cast<int>(input.size()), NULL, 0,
|
|
NULL, NULL);
|
|
|
|
std::string output(length, '\0');
|
|
|
|
::WideCharToMultiByte(code_page, flags, &input[0],
|
|
static_cast<int>(input.size()), &output[0],
|
|
static_cast<int>(output.size()), NULL, NULL);
|
|
|
|
return output;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
std::string Utf16ToUtf8(const std::wstring& utf16_string) {
|
|
return WC2MB(utf16_string, CP_UTF8);
|
|
}
|
|
|
|
std::wstring Utf8ToUtf16(const std::string& utf8_string) {
|
|
return MB2WC(utf8_string, CP_UTF8);
|
|
}
|