FAQ:WinAPI VCPP:перекодировка между windows-1251 и UTF-8
Материал из Весельчак У
Как производится конвертация из кодировки UTF8 в 1251 и наоборот?
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251
Ниже приведена структура, содержащая процедуры перекодирования, а также процедуру с примером использования.
// описание структуры
struct coder
{
// utf8->unicode
static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)
{
wchar_t* pRes = 0;
int res_len = 0;
// тест на возможность преобразования
res_len = MultiByteToWideChar(CP_UTF8, 0, utf8_string, -1, 0, 0);
if (!res_len)
return 0;
// выделяем память
pRes = new wchar_t[res_len];
if (!pRes)
return 0;
// преобразование
if (!MultiByteToWideChar(CP_UTF8, 0, utf8_string, -1, pRes, res_len))
{
delete[] pRes;
return 0;
}
return pRes;
}
// unicode->1251
static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)
{
char* pRes = 0;
int res_len = 0;
// тест на возможность преобразования
res_len = WideCharToMultiByte(1251, 0, unicode_string, -1, 0, 0, 0, 0);
if (!res_len)
return 0;
// выделяем память
pRes = new char[res_len];
if (!pRes)
return 0;
// преобразование
if (!WideCharToMultiByte(1251, 0, unicode_string, -1, pRes, res_len, 0, 0))
{
delete[] pRes;
return 0;
}
return pRes;
}
// процедура с примером
static void Example()
{
wchar_t* unicode_string = 0;
char* cp1251_string = 0;
// исходный текст
char utf8_string[] = "UTF-8 + русский текст";
for (;;)
{
unicode_string = utf8_to_unicode__dontForgetDeleteArr(utf8_string);
if (!unicode_string)
{
AfxMessageBox("Не удалось конвертировать в unicode!");
break;
}
cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);
if (!cp1251_string)
{
AfxMessageBox("Не удалось конвертировать из unicode!");
break;
}
break;
}
// cp1251_string - результат
AfxMessageBox(cp1251_string);
// не забываем удалить массивы
if (unicode_string)
{
delete[] unicode_string;
unicode_string = 0;
}
if (cp1251_string)
{
delete[] cp1251_string;
cp1251_string = 0;
}
}
};
// вызов примера
coder::Example();