почему в AfxMessageBox отображаются китайские символы

#visual-c #mfc

#visual-c #mfc

Вопрос:

Этот код отображает приветствие на китайском

 char buffer[10]="hello";
AfxMessageBox((LPCTSTR)buffer);
  

в то время как этот код отображает его на английском

 AfxMessageBox(L"hello");
  

Может кто-нибудь сказать мне, как мне правильно ввести приведенную переменную buffer, если это проблема в моем коде

Ответ №1:

Тип LPCTSTR представляет собой длинный указатель на прозрачную строку. Что здесь важно, так это T, прозрачный (по крайней мере, я думаю, что T означает прозрачный).

Если ваше приложение скомпилировано как приложение ASCII, все типы T (например, TCHAR) переопределяются как их аналог ASCII. Таким образом, TCHAR станет просто символом.

Если ваше приложение скомпилировано в формате Unicode, все типы T переопределяются как типы Unicode. TCHAR становится wchar_t .

То же самое верно для всех функций Windows (и MFC). Все функции Windows представлены в двух вариантах: версии ASCII (например, MessageBoxA) и версии Unicode (например, MessageBoxW). Сам MessageBox — это не что иное, как определение либо MessageBoxA, либо MessageBoxW (в зависимости от того, как вы компилируете).

В вашем примере buffer определен как тип char-vector, но вы преобразуете его в указатель на прозрачный тип. Я предполагаю, что ваше приложение скомпилировано в Юникоде, поэтому LPCTSTR на самом деле является «wchar_t *». Итак, это приведение неверно.

Добавление к строке «hello» символа L указывает компилятору присвоить константе «hello» значение строки в Юникоде, что делает ее правильным типом для передачи в версию AfxMessageBox в Юникоде.

Ответ №2:

Если у вас есть флаг _UNICODE и UNICODE , определенный в настройках вашего компилятора, то приведение строки LPCTSTR будет обрабатывать строку как строку Unicode. В случае Windows он будет обрабатывать каждые 16 байт как один символ и попытается найти соответствующий символ Юникода. Чтобы заставить его отображать английские символы, используйте TCHAR при определении массива.