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();