2014-01-05 1 views
1

Есть ли простой способ конвертировать многобайтовые данные UTF8 (из API контактов Google через https://www.google.com/m8/feeds/) в одиночные байты? Я знаю, что расширенный набор ASCII является нестандартным, но, например, моя программа, которая будет отображать информацию в MFC CListBox, очень счастлива показать «E sharp» как 0xE9. Мне нужно только это, чтобы справиться с несколькими подобными европейскими символами. Я обнаружил, что могу конвертировать все с помощью MultiByteToWideChar(), но не хочу менять множество функций, чтобы принимать широкие символы, если это возможно. Спасибо.Многоуровневые символы Visual Studio для одиночных байтов

+0

Do вы хотите, чтобы UTF8 был ANSI? – herohuyongtao

+0

Я полагаю, вы могли бы сделать MultiByteToWideChar, а затем WideCharToMultiByte с соответствующим параметром кодировки. YMMV и те европейские символы, о которых вы говорите, могут не отображаться одинаково в каждой локали Windows. Переход с помощью unicode (wide-char) приведет к получению более последовательных результатов. – selbie

+0

Поддержка MBCS для MFC постепенно прекращается. В Visual Studio 2013 больше нет поддержки MBCS для MFC (хотя есть отдельная загрузка). Лучше измените свой код, чтобы использовать Unicode, пока еще есть время. – IInspectable

ответ

1

Если вам нужно конвертировать 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; 
} 
+0

утечка памяти на wszString – manuell

+0

@manuell Исправлено. Благодарю. – herohuyongtao

+1

Большое спасибо за вашу помощь - функция выше отлично работает. Если бы я знал, что есть слово - ANSI - за то, что я был после этого, это помогло бы! Предупреждение о MFC также принято на борту. – gregston

1

Utf8 имеет сопоставление 1 к 1 с символами Ascii, поэтому, если вы получаете символы Ascii как utf8, AFAIK вы можете напрямую прочитать их как Ascii. Если у вас есть не-ASCII символы, то нет никакого способа, вы можете выразить их в формате ASCII (любые байты> 0x80)