Есть ли простой способ конвертировать многобайтовые данные UTF8 (из API контактов Google через https://www.google.com/m8/feeds/) в одиночные байты? Я знаю, что расширенный набор ASCII является нестандартным, но, например, моя программа, которая будет отображать информацию в MFC CListBox, очень счастлива показать «E sharp» как 0xE9. Мне нужно только это, чтобы справиться с несколькими подобными европейскими символами. Я обнаружил, что могу конвертировать все с помощью MultiByteToWideChar(), но не хочу менять множество функций, чтобы принимать широкие символы, если это возможно. Спасибо.Многоуровневые символы Visual Studio для одиночных байтов
ответ
Если вам нужно конвертировать char *
из UTF8
в ANSI
, попробуйте следующую функцию:
// change encoding from UTF8 to ANSI
char* change_encoding_from_UTF8_to_ANSI(char* szU8)
{
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
wszString[wcsLen] = '\0';
int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen + 1];
::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
szAnsi[ansiLen] = '\0';
delete []wszString;
return szAnsi;
}
утечка памяти на wszString – manuell
@manuell Исправлено. Благодарю. – herohuyongtao
Большое спасибо за вашу помощь - функция выше отлично работает. Если бы я знал, что есть слово - ANSI - за то, что я был после этого, это помогло бы! Предупреждение о MFC также принято на борту. – gregston
Utf8 имеет сопоставление 1 к 1 с символами Ascii, поэтому, если вы получаете символы Ascii как utf8, AFAIK вы можете напрямую прочитать их как Ascii. Если у вас есть не-ASCII символы, то нет никакого способа, вы можете выразить их в формате ASCII (любые байты> 0x80)
Do вы хотите, чтобы UTF8 был ANSI? – herohuyongtao
Я полагаю, вы могли бы сделать MultiByteToWideChar, а затем WideCharToMultiByte с соответствующим параметром кодировки. YMMV и те европейские символы, о которых вы говорите, могут не отображаться одинаково в каждой локали Windows. Переход с помощью unicode (wide-char) приведет к получению более последовательных результатов. – selbie
Поддержка MBCS для MFC постепенно прекращается. В Visual Studio 2013 больше нет поддержки MBCS для MFC (хотя есть отдельная загрузка). Лучше измените свой код, чтобы использовать Unicode, пока еще есть время. – IInspectable