суббота, 28 августа 2010 г.

Что там у нас с флагом ES_OEMCONVERT?

Это перевод What is the deal with the ES_OEMCONVERT flag? Автор: Реймонд Чен.

Стиль элемента управления ES_OEMCONVERT является пережитком прошлого 16-ти битных Windows. Эта старинная статья MSDN из SDK Windows 3.1 описывает этот флаг так:
ES_OEMCONVERT приводит к тому, что текст, вводимый в элемент управления edit будет конвертироваться из ANSI в OEM, а затем обратно в ANSI. Это гарантирует корректную конвертацию символов, когда приложение вызывает функцию AnsiToOem, чтобы перевести строку из edit в OEM символы. ES_OEMCONVERT особенно полезна для элементов управления для ввода имён файлов.
Заведите свою машину времени на, скажем, 31-е января 1992-го - дату, когда была написана эта статья.

В это время доминирующей платформой Windows была Windows 3.0. До выхода Windows 3.1 было ещё несколько месяцев, а Windows NT 3.1 появится только через год. Среди файловых систем доминировала 16-ти битная FAT, а одной из её свойств, имеющих отношение к нашей дискуссии, являлось хранение имён файлов на диске в наборе символов OEM (мы обсуждали путаницу между кодовыми страницами OEM и ANSI ранее).

Поскольку GUI программы используют набор символов ANSI, но имена файлов хранятся в наборе символов OEM, то получается, что вы могли использовать в именах файлов только те символы, которые существовали в обоих наборах символов. Если символ существовал в наборе символов ANSI, но не в наборе символов OEM, то у вас не было возможности использовать его в качестве имени файла; а если символ существовал только в наборе символов OEM, но не в ANSI, то GUI не смогла бы им управлять, потому что вы не могли ни показать это имя файла, ни ввести его с клавиатуры.

Флаг ES_OEMCONVERT для элементов управления edit гарантировал вам, что все введённые символы будут существовать в обоих кодовых страницах: OEM и ANSI, вот почему примечание говорит "ES_OEMCONVERT особенно полезна для элементов управления для ввода имён файлов".

Быстрая перемотка времени на настоящее время.

Все популярные файловые системы Windows поддерживают Unicode в именах файлов вот уже более пятнадцати лет. У вас больше нет потери данных при конвертации из ANSI в набор символов файловой системы. Поэтому, нет никакой необходимости фильтровать вводимые символы, чтобы не дать пользователю ввести символ, который будет потерян при конвертации. Другими словами, сегодня флаг ES_OEMCONVERT бесполезен. Это просто рудимент от времён до Unicode.

В самом деле, если вы используете этот флаг, то сделаете свою программу хуже, а не лучше - потому что вы насильно ограничите набор символом, которые она могла бы использовать в именах файлов. Пользователь, работающий на версии US-English Windows не сможет, к примеру, использовать китайские символы в качестве имён файлов, хотя файловая система вполне способна создавать файлы с такими именами.

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

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

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

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

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

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

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