Символы Юникода в заголовке окна

У нас возникли проблемы с установкой заголовков окон с использованием кириллицы или японских символов. Мы видим либо вопросительные знаки, либо случайный мусор, но не тот текст, который нам нужен. Мы пробовали использовать разные кодировки, SetWindowText(), SetWindowTextW(), SetWindowTextA() и так далее. Мы даже не можем заставить его работать, передав строковый литерал в SetWindowText().

В нашей установке Windows, похоже, есть все, что нужно — например, Internet Explorer и Firefox правильно отображают кириллицу и японские подписи. Поэтому я почти уверен, что мы не находим правильную комбинацию кодирования/метода. Какие-либо предложения?


person ggambett    schedule 06.01.2009    source источник


Ответы (3)


SetWindowText()? Вы скомпилировали свое приложение как Unicode? Если нет, SetWindowText() эквивалентен SetWindowTextA(), который, в свою очередь, ограничен текущим языковым стандартом вашей системы (он же «Язык для приложений, отличных от Unicode»).

Кроме того, как вы СОЗДАЛИ свое окно? Используя явно поддерживающий Unicode API, такой как CreateWindowExW()? Если нет, убедитесь, что ваша программа скомпилирована как Unicode.

Если ваша программа не скомпилирована как Unicode, вы можете либо изменить свой «Язык для приложений, отличных от Unicode», в CP/Regional Options. Требуется перезагрузка. Или проще: используйте MS AppLocale для имитации кириллической системной локали.

person Serge Wautier    schedule 06.01.2009
comment
В итоге мы использовали MultiByteToWideChar(), но не знали AppLocale. Это было очень полезно! - person ggambett; 08.01.2009

Проблема, с которой вы столкнулись (наверное), заключается в том, что окно фрейма верхнего уровня вашего приложения является окном ANSI. Под капотом, когда вы создаете окно (с помощью CreateWindow() или CreateWindowEx()), должен быть предоставлен класс окна. Этот класс окна определяет свойства окна, включая то, принимает ли оно по умолчанию сообщения ANSI или сообщения Unicode. В свою очередь, это определяется тем, регистрируете ли вы (или ваш фреймворк) класс окна, вызывая RegisterClassExA() или RegisterClassExW().

Почти наверняка происходит то, что класс вашего окна верхнего уровня регистрируется с помощью RegisterClassExA(). Это означает, что оконная процедура по умолчанию для окна будет переводить все строки Unicode в сообщениях в ANSI перед их обработкой, отсюда и вопросительные знаки и нечетные символы повсюду.

Самое простое решение для всего этого - просто сделать ваше приложение Unicode во всем (обычно это делается путем определения _UNICODE). Другой способ — выяснить, где вызывается RegisterClassEx(), и сделать его RegisterClassExW(). Это может вызвать проблемы ANSI/Unicode с другими сообщениями, но должно (по крайней мере теоретически) работать. Конечно, в любом случае Windows 9X сломается, если это проблема.

Если все это звучит ужасно сложно, вы не ошиблись...

person DavidK    schedule 07.01.2009

Вы должны скомпилировать свое приложение с определенным _UNICODE. В противном случае все окна по-прежнему будут MBCS, а не utf-16, и поэтому не смогут отображать кириллицу или японские символы, если кодовая страница не совпадает.

person Stefan    schedule 06.01.2009