Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top