UTF-8 из файла в TextBox VC ++ 6.0 - PullRequest
1 голос
/ 13 января 2009

Как мне получить старую программу VC ++ 6.0 MFC для чтения и отображения 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);

До сих пор не уверен, как бы я поместил его в текстовое поле, но оказывается, что мне все равно это не нужно.

Ответы [ 4 ]

2 голосов
/ 13 января 2009

Я чувствую, что это не поможет, но это отправная точка ... Я предполагаю, что это не "просто работает", и я не думаю, что вы хотите попытаться обойти с дурацким кодом страницы, которые могут или не могут дать вам то, что вы хотите.

Как насчет использования MultiByteToWideChar (CP_UTF8, ...) для преобразования его в utf16 и последующего вызова версий этих функций W (или определения UNICODE / _UNICODE для проекта).

Я знаю, что это будет работать для MessageBox, и я не могу представить, что текстовое поле не поддерживает Unicode.

Если вам нужно вернуть вывод в UTF8 - просто используйте WideCharToMultiByte ().

0 голосов
/ 13 января 2009

Является ли ваше приложение 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 для Unicode (UTF16).

Отображение строки в текстовом поле останется трудным, хотя: вам нужно программно создать текстовое поле как окно Unicode, используя CreateWindowExW(). Что, я считаю, не будет работать, если родительское окно текстового поля (диалоговое окно, фрейм?) Не является окном Unicode.

0 голосов
/ 13 января 2009

Преобразуйте сначала строку utf8 в широкую строку с помощью API MultiByteToWideChar , передав CP_UTF8 для параметра кодовой страницы. Если ваше приложение скомпилировано с определенным _UNICODE, теперь вы можете передать широкую строку в текстовое поле.

Если ваше приложение, однако, скомпилировано как приложение MBCS, вы должны преобразовать широкую строку обратно в MBCS с WideCharToMultiByte , передав CP_ACP в качестве параметра кодовой страницы.

0 голосов
/ 13 января 2009

взгляните на:

widechartomultibyte и для более общей информации

когда / если у вас возникли проблемы, обязательно напишите свой код. Прошло много времени с тех пор, как я это сделал, и я помню, что это было немного сложно.

...