|
@@ -220,31 +220,37 @@ std::u16string UTF8ToUTF16(const std::string& input) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static std::wstring CPToUTF16(u32 code_page, const std::string& input) {
|
|
static std::wstring CPToUTF16(u32 code_page, const std::string& input) {
|
|
|
- auto const size =
|
|
|
|
|
|
|
+ const auto size =
|
|
|
MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
|
MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
|
|
|
|
|
|
|
- std::wstring output;
|
|
|
|
|
- output.resize(size);
|
|
|
|
|
|
|
+ if (size == 0) {
|
|
|
|
|
+ return L"";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ std::wstring output(size, L'\0');
|
|
|
|
|
|
|
|
- if (size == 0 ||
|
|
|
|
|
- size != MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()),
|
|
|
|
|
- &output[0], static_cast<int>(output.size())))
|
|
|
|
|
|
|
+ if (size != MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()),
|
|
|
|
|
+ &output[0], static_cast<int>(output.size()))) {
|
|
|
output.clear();
|
|
output.clear();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return output;
|
|
return output;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::string UTF16ToUTF8(const std::wstring& input) {
|
|
std::string UTF16ToUTF8(const std::wstring& input) {
|
|
|
- auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
|
|
|
|
|
|
+ const auto size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
|
|
nullptr, 0, nullptr, nullptr);
|
|
nullptr, 0, nullptr, nullptr);
|
|
|
|
|
+ if (size == 0) {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- std::string output;
|
|
|
|
|
- output.resize(size);
|
|
|
|
|
|
|
+ std::string output(size, '\0');
|
|
|
|
|
|
|
|
- if (size == 0 ||
|
|
|
|
|
- size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
|
|
|
|
- &output[0], static_cast<int>(output.size()), nullptr, nullptr))
|
|
|
|
|
|
|
+ if (size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
|
|
|
|
+ &output[0], static_cast<int>(output.size()), nullptr,
|
|
|
|
|
+ nullptr)) {
|
|
|
output.clear();
|
|
output.clear();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return output;
|
|
return output;
|
|
|
}
|
|
}
|
|
@@ -265,8 +271,6 @@ std::string CP1252ToUTF8(const std::string& input) {
|
|
|
|
|
|
|
|
template <typename T>
|
|
template <typename T>
|
|
|
static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>& input) {
|
|
static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>& input) {
|
|
|
- std::string result;
|
|
|
|
|
-
|
|
|
|
|
iconv_t const conv_desc = iconv_open("UTF-8", fromcode);
|
|
iconv_t const conv_desc = iconv_open("UTF-8", fromcode);
|
|
|
if ((iconv_t)(-1) == conv_desc) {
|
|
if ((iconv_t)(-1) == conv_desc) {
|
|
|
LOG_ERROR(Common, "Iconv initialization failure [{}]: {}", fromcode, strerror(errno));
|
|
LOG_ERROR(Common, "Iconv initialization failure [{}]: {}", fromcode, strerror(errno));
|
|
@@ -278,8 +282,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
|
|
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
|
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
|
|
const size_t out_buffer_size = 4 * in_bytes;
|
|
const size_t out_buffer_size = 4 * in_bytes;
|
|
|
|
|
|
|
|
- std::string out_buffer;
|
|
|
|
|
- out_buffer.resize(out_buffer_size);
|
|
|
|
|
|
|
+ std::string out_buffer(out_buffer_size, '\0');
|
|
|
|
|
|
|
|
auto src_buffer = &input[0];
|
|
auto src_buffer = &input[0];
|
|
|
size_t src_bytes = in_bytes;
|
|
size_t src_bytes = in_bytes;
|
|
@@ -304,6 +307,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ std::string result;
|
|
|
out_buffer.resize(out_buffer_size - dst_bytes);
|
|
out_buffer.resize(out_buffer_size - dst_bytes);
|
|
|
out_buffer.swap(result);
|
|
out_buffer.swap(result);
|
|
|
|
|
|
|
@@ -313,8 +317,6 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::u16string UTF8ToUTF16(const std::string& input) {
|
|
std::u16string UTF8ToUTF16(const std::string& input) {
|
|
|
- std::u16string result;
|
|
|
|
|
-
|
|
|
|
|
iconv_t const conv_desc = iconv_open("UTF-16LE", "UTF-8");
|
|
iconv_t const conv_desc = iconv_open("UTF-16LE", "UTF-8");
|
|
|
if ((iconv_t)(-1) == conv_desc) {
|
|
if ((iconv_t)(-1) == conv_desc) {
|
|
|
LOG_ERROR(Common, "Iconv initialization failure [UTF-8]: {}", strerror(errno));
|
|
LOG_ERROR(Common, "Iconv initialization failure [UTF-8]: {}", strerror(errno));
|
|
@@ -326,8 +328,7 @@ std::u16string UTF8ToUTF16(const std::string& input) {
|
|
|
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
|
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
|
|
const size_t out_buffer_size = 4 * sizeof(char16_t) * in_bytes;
|
|
const size_t out_buffer_size = 4 * sizeof(char16_t) * in_bytes;
|
|
|
|
|
|
|
|
- std::u16string out_buffer;
|
|
|
|
|
- out_buffer.resize(out_buffer_size);
|
|
|
|
|
|
|
+ std::u16string out_buffer(out_buffer_size, char16_t{});
|
|
|
|
|
|
|
|
char* src_buffer = const_cast<char*>(&input[0]);
|
|
char* src_buffer = const_cast<char*>(&input[0]);
|
|
|
size_t src_bytes = in_bytes;
|
|
size_t src_bytes = in_bytes;
|
|
@@ -352,6 +353,7 @@ std::u16string UTF8ToUTF16(const std::string& input) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ std::u16string result;
|
|
|
out_buffer.resize(out_buffer_size - dst_bytes);
|
|
out_buffer.resize(out_buffer_size - dst_bytes);
|
|
|
out_buffer.swap(result);
|
|
out_buffer.swap(result);
|
|
|
|
|
|