MFC CEdit преобразует не-ascii символы в ascii - PullRequest
1 голос
/ 22 мая 2019

У нас есть приложение MFC для Windows, изначально написанное на VC ++ 6 и обновлявшееся годами для более новой IDE, которое в настоящее время разрабатывается в VS2017.

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

Однако мы хотим иметь возможность запускать приложение с другой кодовой страницей, т.е. 1250 (Центральноевропейский).

Я попытался создать небольшое тестовое приложение, и мне удалось заставить его работать со специальными символами (čćšđž). Я сделал это, установив шрифт диалога Microsoft Sans Serif с кодовой страницей 1250. Такой же подход в нашем приложении не работает. Примечание: диалоги в нашем приложении создаются динамически, а шрифт устанавливается с помощью SetFont.

Существует разница в том, как обрабатываются специальные символы в этих двух приложениях.

  • В тестовом приложении специальные символы отображаются в элементе управления редактированием, а GetWindowsText извлекает нужные байты. Однако, пытаясь написать некоторые символы из других языков, выдает их как «????».
  • В нашем приложении все специальные символы отображаются правильно, но GetWindowText (или WM_GETTEXT) преобразует специальные символы в аналогичный аналог ascii (čćđ -> ccd).

Я считаю, что элемент управления Edit в нашем приложении отображает текст Unicode, но GetWindowText преобразует его в ascii.

Кто-нибудь знает, что здесь происходит, и как я могу это решить?

Примечание: Я знаю, как конвертировать проект в Unicode. В настоящее время мы предпочитаем не выделять на это ресурсы, так как на это, возможно, потребуются недели или месяцы. Вопрос в том, как заставить его работать с MBSC и почему управление редактированием преобразует Č в C.

1 Ответ

2 голосов
/ 22 мая 2019

Я считаю, что абсолютно возможно портировать приложение на другие языки / кодовые страницы, вам нужно всего лишь изменить файлы .rc (ресурс), в основном имея один файл ресурсов для каждого языка, что вы, скорее всего, захотите сделать в любом случае,поскольку строки в меню и / или таблицах строк будут на другом языке.И это фактически единственное необходимое изменение в части приложения.

Другая часть - это система, на которой вы ее запускаете.Окно может быть Unicode или не Unicode.Это можно увидеть с помощью утилиты Spyxx, которая сообщает вам, является ли окно (процедура) юникодом или нет (Свойства окна, вкладка Общие).И хотя окна Unicode работают должным образом, окна, не поддерживающие Unicode, должны изменять кодировку с / на Unicode и MBSC при получении или установке текста.Преобразование основано на кодовой странице системы (по умолчанию).Это может быть установлено только глобально (для всей машины), а не для приложения или окна.И, конечно же, установка кодовой страницы шрифта не достаточна (и, в принципе, она вообще не нужна, если вы запускаете приложение на компьютере с «правильной» кодовой страницей).То есть для приложений, не поддерживающих Юникод, только одна кодовая страница будет работать должным образом, другие - нет.

Я вижу два варианта:

  • Если вам нужно только обновитьнебольшое количество элементов управления, возможно, будет возможно изменить только эти элементы управления на Unicode, и использовать "широкие" версии функций или сообщений для проверки окна get / set - вам придется преобразовать текст между Unicode и желаемой кодовой страницей,Это требует написания некоторого кода, но имеет то преимущество, что преобразование не зависит от системной кодовой страницы по умолчанию, например, вы можете иметь кодовую страницу в каком-то файле конфигурации, в реестре или в качестве опции командной строки (в ярлыке приложения).Некоторые типы элементов управления могут быть изменены на Unicode, другие нет, поэтому, пожалуйста, проверьте документацию.Успешно использовал эту технику для приложения mbcs, отображающего / редактирующего переведенные строки на многих разных языках, но у меня был только один элемент управления, List-View, который, кстати, предлагает сообщение LVM_SETUNICODEFORMAT, что позволяет использовать тексты Unicode даже в приложении mbcs.
  • Самый простой метод - просто запустить приложение как есть, но оно будет работать только на машинах с правильной кодовой страницей по умолчанию, как это делают большинство не-юникодных приложений.

Системную кодовую страницу по умолчанию можно изменить, установив параметр "Язык для программ, не поддерживающих Юникод" * , который доступен в региональных настройках на вкладке "Администрация" и требует перезагрузки.Изменение языка пользовательского интерфейса Windows также изменит эту опцию, но, установив этот параметр, вам не нужно менять язык пользовательского интерфейса, например, вы можете иметь английский пользовательский интерфейс и восточноевропейскую кодовую страницу.

См. Очень похожийсообщение здесь .

...