Артем Капралов
Ученик
(210)
9 часов назад
//кодировки
string Utf8_to_cp1251(const char* str)
{
string res;
int result_u, result_c;
result_u = MultiByteToWideChar(CP_UTF8,
0,
str,
-1,
0,
0);
if (!result_u)
return 0;
wchar_t* ures = new wchar_t[result_u];
if (!MultiByteToWideChar(CP_UTF8,
0,
str,
-1,
ures,
result_u))
{
delete[] ures;
return 0;
}
result_c = WideCharToMultiByte(
1251,
0,
ures,
-1,
0,
0,
0, 0);
if (!result_c)
{
delete[] ures;
return 0;
}
char* cres = new char[result_c];
if (!WideCharToMultiByte(
1251,
0,
ures,
-1,
cres,
result_c,
0, 0))
{
delete[] cres;
return 0;
}
delete[] ures;
res.append(cres);
delete[] cres;
return res;
}
Папизи
Профи
(878)
9 часов назад
#include <iconv.h>
#include <iostream>
#include <cstring>
std::string convert_utf8_to_utf16(const std::string& utf8) {
iconv_t conv = iconv_open("UTF-16LE", "UTF-8");
if (conv == (iconv_t)-1) {
perror("iconv_open");
return "";
}
size_t in_bytes_left = utf8.size();
size_t out_bytes_left = in_bytes_left * 2 + 2; // UTF-16 в два раза больше
char* in_buf = const_cast<char*>(utf8.c_str());
std::string utf16(out_bytes_left, '\0'); // резервируем память
char* out_buf = &utf16[0];
if (iconv(conv, &in_buf, &in_bytes_left, &out_buf, &out_bytes_left) == (size_t)-1) {
perror("iconv");
iconv_close(conv);
return "";
}
iconv_close(conv);
// Обрезаем выходную строку для правильного отображения
utf16.resize(utf16.size() - out_bytes_left);
return utf16;
}
int main() {
std::string utf8_string = u8"Привет, мир!";
std::string utf16_string = convert_utf8_to_utf16(utf8_string);
// Output utf16_string as needed...
return 0;
}