Как мне заставить старую программу MFC VC++ 6.0 читать и отображать UTF8 в TextBox или MessageBox? Желательно без нарушения чтения и отображения файла, который в настоящее время записан (довольно существенный).
Я прочитал строку в CString strStr, затем использовал этот код:
int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,strStr,1024,0,0);
wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ];
MultiByteToWideChar(CP_UTF8,0,strStr,1024,pWCMessage,nLengthNeeded);
nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,"Error Title",50,0,0);
wchar_t * pWCTitle = new wchar_t[ nLengthNeeded ];
MultiByteToWideChar(CP_UTF8,0,"Error Title",50,pWCTitle,nLengthNeeded);
MessageBoxW(NULL,pWCMessage,pWCTitle,MB_ICONINFORMATION);
До сих пор не знаю, как мне поместить его в текстовое поле, но, как оказалось, мне все равно не нужно этого делать.





Взгляни на:
широкая диаграмма и для более общей информации
когда / если у вас возникнут проблемы, обязательно разместите свой код. Прошло некоторое время с тех пор, как я это сделал, и я помню, что это было немного сложно.
Я чувствую, что это бесполезно, но это отправная точка ... Я предполагаю, что это не «просто работает», и я не думаю, что вы хотите пытаться облажаться с дурацкими кодовыми страницами, которые могут или может не получить то, что вы хотите.
Как насчет того, чтобы просто использовать MultiByteToWideChar (CP_UTF8, ...), чтобы преобразовать его в utf16, а затем вызвать W-версии этих функций (или определить UNICODE / _UNICODE для проекта).
Я знаю, что это сработает для MessageBox, и я не могу представить, что текстовое поле не поддерживает Unicode.
Если вам нужно вернуть вывод в UTF8 - просто используйте WideCharToMultiByte ().
Сначала преобразуйте строку utf8 в широкую строку с помощью API MultiByteToWideChar, передав CP_UTF8 в качестве параметра кодовой страницы. Если ваше приложение скомпилировано с определением _UNICODE, теперь вы можете передать широкую строку в текстовое поле.
Однако если ваше приложение скомпилировано как приложение MBCS, вы должны преобразовать широкую строку обратно в MBCS с помощью WideCharToMultiByte, передав CP_ACP в качестве параметра кодовой страницы.
Ваше приложение Unicode. Если да, вернитесь к ответу Стефана:
MyDisplayableUtf16String = MultiByteToWideChar (CP_UTF8, MyUtf8String, ...)
Я предполагаю, что это не так просто: ваше приложение - ANSI. Прежде всего, вам нужно преобразовать строку в UTF16, как показано выше. Тогда есть узкое место: содержит ли ваша строка UTF8 символы помимо текущей системной кодовой страницы (также известной как «Язык для приложений, не поддерживающих Юникод»)? Если нет, преобразуйте строку UTF16 в языковой стандарт системы, используя
MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)
(или используйте один из макросов ATL / MFC, например W2A(MyUtf16String))
и вы сделали.
В противном случае строка не может быть преобразована в ANSI, а это означает, что вам будет ... кхм ... трудно отобразить ее в текстовом поле ANSI или окне сообщения.
Как отметил Джо, вы можете отобразить текст в окне сообщения, используя
MessageBoxW (..., MyDisplayableUtf16String, ...)
Буква W в конце обозначает версию API в Юникоде (UTF16).
Однако отображение строки в текстовом поле останется трудным: вам нужно будет программно создать текстовое поле как окно Unicode, используя CreateWindowExW(). Я считаю, что это не сработает, если родительское окно текстового поля (диалоговое окно, фрейм?) Не является окном Unicode.
Вызов функций W в текстовом поле, вероятно, не будет работать, если вы создали его с помощью CreateWindowA. Вы должны быть последовательными.