понедельник, 6 декабря 2010 г.

Ещё один налог для отсутствия поддержки Unicode?

Это перевод Yet another cost to not supporting Unicode? Автор: Майкл Каплан.

Очень трудно печатать, когда у тебя растяжение плеча. Слава богу, есть Dragon Dictate! Это я просто так...

Alex спросил меня в Suggestion Box:
Привет, Майкл.

Я погуглил по твоему блогу, но не нашёл ответа на такой вопрос. Этот вопрос довольно популярен (по крайней мере, в России), и я был удивлён, что ты его ещё не покрыл. Так что, быть может, ты расскажешь историю за этим вопросом. Это вопрос про буфер обмена, текст и не Unicode приложения.

Возьми старое не Unicode приложение (вроде блокнота из Win9x) и запусти его на новых Windows (вроде XP), которая имеет два установленных языка (скажем, английский и русский). Предположим, что "Язык для не Unicode приложений" установлен в "Русский".

В Win9x ты мог без проблем скопировать текст через буфер обмена из любого приложения в любое другое. Конечно, старые приложения не заботились об установке CF_LOCALE вместе с CF_TEXT, но всё работало довольно прилично, поскольку приложениями использовалась одна и та же кодовая страница (ладно: почти всеми).

Теперь, возьми современную, "юникодную" ОС, вроде XP. Ты берёшь своё старое приложение, которое верой и правдой служило тебе много лет, копируешь текст в буфер и вставляешь в другое приложение (скажем, блокнот из Windows XP) и... ух ты: ты получаешь вопросительные знаки или белиберду. Что не так? Чёрт, ты забыл переключить клавиатуру на "Русский". Как только ты это сделаешь - всё начнёт работать нормально.


Верхний ряд: слева - блокнот из Win98, справа - блокнот из XP. Нижний ряд: слева - блокнот из XP, справа - из Win98. Текущий язык стоит в "English (United states)" (ну, т.е. мы не переключили на русский). Красные линии указывают операцию копирования текста через буфер обмена (я специально взял два приложения от Microsoft, чтобы указать, что это не баг в каком-то конректном стороннем приложении).

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

Это ужасное нарушение в опыте использования. Большинство людей считают, что это баг. Я очень часто слышу эту жалобу (чёрт, да я слышу проклятия Microsoft почти всегда в таких случаях). Особенно тяжело объяснить, что это не баг в твоём приложении, написанном много лет назад - оно не виновато.

Не мог бы ты пролить немного света на эту проблему? Почему Microsoft решила (ладно, не сломать, но) усложнить жизнь базилионам существующих приложений? Если Microsoft так заботится об обратной совместимости, то почему было сделано такое решение?
Это звучит очень знакомо.

Не могу ткнуть пальцем...

Ах, да - я думал о Двойное тайное ANSI, часть 1 (где-то на полпути от ANSI к Unicode) и Двойное тайное ANSI, часть 2 (самая кривая часть, извините!).

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

Версия из NT заполняет эти белые места, но, кажется, к этим недоработкам уже привыкли люди.

Технически, NT-версия этой возможности всегда была сломана. Это делает её исправление очень тяжёлым - в противоположность поддержки Unicode в приложениях.

Исторически, мы, кажется, имеем привычку ломать программы людей, который не используют Unicode. В этом нет никакого злого умысла, просто Unicode приложения получают большее тестовое покрытие...

1 комментарий:

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

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

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

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

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