пятница, 3 декабря 2010 г.

В Windows Vista некоторые клавиатуры не работают с ANSI приложениями

Это перевод Some Keyboards fail with ANSI applications on Windows Vista RTM. Автор: Shawn Steele.

В Windows Vista произошёл пренеприятнейший баг, который привёл к неработоспособности некоторых клавиатурных раскладок в ANSI приложениях. Это удивительно (в печальном смысле этого слова), потому что этот баг умудрился пройти через дюжину тестов, которые мы делаем, чтобы такие вещи не происходили.

В любом случае, клавиатуры, связанные с указанными ниже локалями, могут иметь проблему для некоторых своих символов (я сделал этот список быстрым анализом и он может быть не полностью точен):
  • Romanian (Romania)
  • Ukrainian (Ukraine)
  • Serbian (Latin, Bosnia and Herzegovina)
  • Urdu (Islamic Republic of Pakistan)
  • Belarusian (Belarus)
  • Persian
  • Azeri (Latin, Azerbaijan)
  • Uzbek (Latin, Uzbekistan)
  • Welsh (United Kingdom)
  • Turkmen (Turkmenistan)
  • Irish (Ireland)
  • Uighur (PRC)
  • Upper Sorbian (Germany)
  • Hausa (Latin, Nigeria)
  • Yoruba (Nigeria)
  • Dari (Afghanistan)
  • Lower Sorbian (Germany)
  • K'iche (Guatemala)
  • Wolof (Senegal)
  • Igbo (Nigeria)
  • Chinese (Traditional, Hong Kong S.A.R.) (IME не подвержена этому багу)
Кроме того, следующие локали - "Unicode Only" и вообще не должны работать с ANSI приложениями, но этот баг может приводить к тому, что кодовые страницы, используемые с этими клавиатурами, могут казаться работающими, но на самом деле имеющими неверное проецирование символов:
  • Kazakh (Kazakhstan)
  • Maori (New Zealand)
  • Pashto (Afghanistan)
  • Maltese (Malta)
Баг заключается в неверных данных от TLocaleSignature для этих локалей (вы можете получить к ним доступ через LOCALE_FONTSIGNATURE в GetLocaleInfoEx, хотя Майкл указывает, что это название довольно запутывающе).

Поля IsCsbDefault и IsCsbSupported записи TLocaleSignature некоторых локалей имеют неверную информацию в Vista, а код ANSI-клавиатур использует IsCsbDefault, чтобы выяснить, на какую кодовую страницу производить проецирование символов. Предположительно, LOCALE_IDEFAULTANSICODEPAGE был бы лучшим выбором в этом случае, но он не используется. В общем, мы не рекомендуем использовать TLocaleSignature или TFontSignature, поскольку они исторически были довольно неаккуратными и часто меняются между версиями системы.

Мы работаем над исправлением этого бага, и я сообщу, когда исправление будет готово.

В качестве обходного пути: нам повезло, что в Vista появились пользовательские локали. Вы можете использовать класс .NET CultureAndRegionInfoBuilder, чтобы создать пользовательскую культуру с исправленой сигнатурой шрифта. Для тех локалей, что поставлялись вместе с XP, вы можете взять данные для локали из XP, или вы можете взять данные из другой локали, которая имеет то же самое значение LOCALE_IDEFAULTANSICODEPAGE. После такого исправления, пользовательская локаль позволит данным загружаться корректно, а ваши клавиатуры снова будут работать в ANSI приложениях. Заметьте, что пользовательская локаль имеет приоритет над любой встроенной локалью, которую мы можем добавить в будущем, так что вам лучше бы убедиться, что вы удалили пользовательскую локаль перед обновлением системы или установкой патча.

Любопытно, что этот баг был сообщён для приложения, которое маркирует себя как Unicode приложение. Мы обнаружили, что многие "Unicode приложения", на самом деле, не используют Unicode везде, и часто зависят от ANSI-ввода (в противном случае они бы не столкнулись с этим багом).

Надеюсь, эта информация была полезной.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.