FAQ:WinAPI VCPP:перекодировка между windows-1251 и UTF-8
Материал из Весельчак У
Версия от 16:04, 3 октября 2009; RXL (обсуждение | вклад) (Новая: ===Как производится конвертация из кодировки UTF8 в 1251 и наоборот?=== Можно перевести строку из UTF8 в Unicode, ...)
Как производится конвертация из кодировки 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();