Поддержка WinAPI и UTF-8 - PullRequest
       30

Поддержка WinAPI и UTF-8

6 голосов
/ 02 февраля 2009

Быстрый вопрос о поддержке UTF-8 и различных Win32 API.

В типичном проекте C ++ MFC возможно ли для MessageBox () отображать строку в кодировке UTF-8?

Спасибо, Andrew

Ответы [ 3 ]

8 голосов
/ 02 февраля 2009

Быстрый ответ: Нет.

Более длинный ответ: Это будет работать, если строка содержит только обычные символы ANSI, например, американский английский, поскольку эти коды символов одинаковы в UTF-8 и ANSI.

Если включены не-ANSI символы или любые двухбайтовые кодированные символы, вам необходимо преобразовать в Unicode-16, используя MultiByteToWideChar с CP_UTF8. Ваша программа также должна быть скомпилирована с определением UNICODE, или вы можете использовать вызовы API W, например MessageBoxW.

(Обратите внимание, что функции, принимающие текстовый аргумент, такой как MessageBox, CreateWindow, отображаются в версии 'A' или 'W' в зависимости от того, определен ли UNICODE).

Это также может быть полезно;

http://www.joelonsoftware.com/articles/Unicode.html

4 голосов
/ 02 февраля 2009

Нет, используйте MultiByteToWideChar с CP_UTF8. См. http://www.siao2.com/2006/10/11/816996.aspx, почему А не может этого сделать; W (UCS-2) является единственной альтернативой.

3 голосов
/ 03 февраля 2009

Я использую макросы преобразования строк ATL / MFC. Например, если у вас есть строка ASCII с именем myUTF8Str, содержащая символы UTF8:

::MessageBox(hWnd, CA2T(myUTF8Str, CP_UTF8), _T("Caption"), MB_OK);

В качестве альтернативы вы можете создать экземпляр строки, например ::

CA2T myConvertedString(myUTF8Str, CP_UTF8);
...
TRACE(_T("Converted: %s\n"), myUTF8Str.m_psz);

Обратите внимание на элемент m_psz, который разрешает доступ только для чтения к необработанному указателю строки.

Вы также можете кодировать, используя CT2A, например ::

CT2A myEncodedString("Some UTF8", CP_UTF8);

Если вы не используете макросы TEXT, используйте CA2W, CW2A и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...