2012-05-27 3 views
1

Можно создать дубликат:
Why does my simple C++ GUI application show a message box in Chinese?Почему окно сообщения в C++ показать КИТАЙСКИЙ сообщение

Я реализовал этот блок кода, как показано ниже в Visual C++:

int nResult=MessageBox(NULL, 
         (LPCWSTR)"An example of Cancel,Retry,Continue", 
         (LPCWSTR)"Message Box!", 
         MB_ICONWARNING|MB_ABORTRETRYIGNORE); 

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

+1

О, боже, опять этот тривиальный вопрос. :-) – Xearinox

+1

У меня тоже есть китайский! Почему мы все получаем китайцев? Есть ли так много китайских символов, что всякий раз, когда строка указывает на какое-то случайное место в памяти, огромные шансы - это будут китайцы? – CodyBugstein

ответ

10

Вы забыли разместить «L» перед строковым литералом. Изменить следующим образом:

int nResult=MessageBox(NULL, 
        L"An example of Cancel,Retry,Continue", 
        L"Message Box!", 
        MB_ICONWARNING|MB_ABORTRETRYIGNORE); 

В C++ Юникода строковые литералы с префиксом L. Если вы не поместите префикс, приведение в строку «unicode string constant» не поможет и приведет к некорректной интерпретации расположения памяти.

+0

Можете ли вы указать мне, где я могу узнать больше об этом конкретном типе кастинга? Насколько я знал, обычно кастинг состоял из '(Type) thingToBeCasted'. Я не понимаю, как мы относимся к «L» и что это значит. – CodyBugstein

+0

Это не актерский состав. Если вы поместите '(LPCWSTR)' перед строковым литералом, это ** - это бросок, но помещая символ 'L' перед строковым литералом, говорит компилятору * интерпретировать * строку как строку Юникода. См. [Здесь] (http://msdn.microsoft.com/en-us/library/69ze775t.ASPX) для получения дополнительной информации. –

+0

Сделайте его широкосимвольными строками, и вы правы. – Deduplicator

5

Ожидается, что для перевода указателя из одного типа в другой будет выбрано какое-либо указание. Это не то, что делают C++. Они просто говорят компилятору предположить, что указатель указывает на новый тип. Чтобы указать wide literal, используйте L перед кавычками (или new string literals, если ваш компилятор их поддерживает). И избавиться от актеров, это просто затмевает ошибку.

4

Как сказал Дэвид, вы передали строку ASCII в строку UNICODE. Вместо этого используйте макрос _TEXT («Ваша строка»).

Вы не можете просто интерпретировать байты ASCII как строку UNICODE, иначе произойдут плохие вещи.

Редактирование: также, если вы хотите, чтобы строки ASCII могли явным образом вызывать MessageBoxA() или изменять настройки нескольких байтов в настройках вашего проекта.

+1

Это правильный подход. Либо используйте _T() или _TEXT() вокруг ваших строковых литералов, либо используйте MessageBoxA() или MessageBoxW(), которые не изменяют, определяется ли макрос UNICODE во время компиляции. Microsoft никогда не должна была вводить этот глупый макрос !!! –

Смежные вопросы