Юникод символы в заголовке окна - PullRequest
2 голосов
/ 06 января 2009

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

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

Ответы [ 3 ]

1 голос
/ 07 января 2009

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

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

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

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

0 голосов
/ 06 января 2009

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

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

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

0 голосов
/ 06 января 2009

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

...