UTF-8 из файла в текстовое поле VC++ 6.0

Как мне заставить старую программу 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);

До сих пор не знаю, как мне поместить его в текстовое поле, но, как оказалось, мне все равно не нужно этого делать.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 369
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Взгляни на:

широкая диаграмма и для более общей информации

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

Ответ принят как подходящий

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

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

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

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

Вызов функций W в текстовом поле, вероятно, не будет работать, если вы создали его с помощью CreateWindowA. Вы должны быть последовательными.

MSalters 14.01.2009 13:27

Сначала преобразуйте строку 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.

Другие вопросы по теме