|
|
@ -162,21 +162,21 @@ void SplitString(const std::string& str, const char delim, std::vector<std::stri |
|
|
std::istringstream iss(str); |
|
|
std::istringstream iss(str); |
|
|
output.resize(1); |
|
|
output.resize(1); |
|
|
|
|
|
|
|
|
while (std::getline(iss, *output.rbegin(), delim)) |
|
|
|
|
|
output.push_back(""); |
|
|
|
|
|
|
|
|
while (std::getline(iss, *output.rbegin(), delim)) { |
|
|
|
|
|
output.emplace_back(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
output.pop_back(); |
|
|
output.pop_back(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::string TabsToSpaces(int tab_size, const std::string& in) { |
|
|
|
|
|
const std::string spaces(tab_size, ' '); |
|
|
|
|
|
std::string out(in); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string TabsToSpaces(int tab_size, std::string in) { |
|
|
size_t i = 0; |
|
|
size_t i = 0; |
|
|
while (out.npos != (i = out.find('\t'))) |
|
|
|
|
|
out.replace(i, 1, spaces); |
|
|
|
|
|
|
|
|
|
|
|
return out; |
|
|
|
|
|
|
|
|
while ((i = in.find('\t')) != std::string::npos) { |
|
|
|
|
|
in.replace(i, 1, tab_size, ' '); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return in; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest) { |
|
|
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest) { |
|
|
@ -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); |
|
|
|
|
|
|
|
|
|