Главная » Delphi » Unicode и Win32

0

Однако в Windows 32-разрядных версий весь механизм объявления языка стал настолько запутанным, что здравая идея двухбайтных Unicode-символов, однозначно определяющих язык, оказалась полностью выхолощенной. Во г как это происходит в логике разработчиков, например, Word. Вы устанавливаете текущую раскладку (в Windows 98 это и называется именно так — "раскладка", но в Windows ХР, как мы увидим, будет уже "язык"), в соответствии с чем происходит переключение кодовой страницы и символы вводятся в нужном начертании. Как мы говорили ранее, сверх этого никакая установка языка отдельно уже не требуется — ведь мы имеем Unicode, в котором каждый символ однозначно сам определяет свою языковую принадлежность. Как бы не так! Наберите в Word русский текст, выделите его, и через меню Сервис | Язык | Выбрать язык объявите его хоть английским, хоть албанским — и такая операция у вас спокойно пройдет! Это кому и в каком страшном сне могло присниться, что текст, который вы читаете сейчас, может быть объявлен английским (причем "английскими" также станут цифры, пробелы, кавычки, точки, запятые…)? Я. как автор этого текста, однозначно и недвусмысленно указал, выбрав раскладку, что перед вами именно русский текст. Иногда в нем встречаются английские слова и отдельные буквы, и для них также однозначно указано в первом байте символа, что именно вот это есть символ английский. Отсюда кошмарная неразбериха с проверкой правописания, когда вы не знаете, подчеркнуто красным слово потому, что вы его неправильно написали, или потому, что оно "английское". Особенно забавно выглядит, когда вы можете написать английское слово, объявить его русским, потом вернуться в его середину, переключиться на английский и вставить одну букву: все, что до этой буквы и после нее, будет подчеркнуто красным, как ошибочно набранное, а сама буква — нет.

Это даже не "программистское мышление", это гораздо хуже, ведь на самом деле никакой операции "присвоения языка" в старом смысле— раскладка там, экранные шрифты — не происходит. Все, что вы проделали, есть чисто фиктивная акция, которая действует разве что на средства проверки орфографии и не самым лучшим, как мы видим, образом. И вы не можете таким образом воздействовать ни на раскладку, ни на переключение экранных шрифтов (кодовой страницы), которое по-прежнему оказывается привязано к раскладке, по самому смыслу относящейся только к вводу, а не к отображению символов. Получается, что разработчики Word фактически ввели еще одно понятие "языка" поверх всех существующих. Раскладки, Unicode, кодовые страницы существуют где-то в ином измерении. Если программа ошиблась в определении кодовой страницы при отображении (демонстрирует то, что удачно окрестили "кракозябрами"4), то исправить эту ошибку средствами, доступными пользователю (как в браузерах— просто выбором кодировки вручную), не удастся — хотя это самая прямая и, пожалуй, единственная обязанность операции выбора "языка", которая могла бы оправдать существование самого этого понятия отдельно (и в однобайтных кодировках оправдывала!). Логично было бы просто взять текст с "кракозябрами", выделить его, и упомянутым ранее способом объявить язык русским. А система бы тогда аккуратно объяснила пользователю, что в использованном им шрифте поддержки русского нет, а потому нужно либо оставить все, как есть, либо шрифт заменят на другой подходящий. Видно, как люди решали сиюминутные проблемы, наращивая слой за слоем функциональность, спущенную им из маркетингового отдела.

А что касается Windows ХР с декларированной поддержкой Unicode на уровне системы, то там картина еще печальнее— возможность различать однобайтные кодовые страницы окончательно привязана к раскладке. Проведите следующий эксперимент: откройте Word (подразумевается, что у вас Word также версии 2000 или выше) и Блокнот, затем наберите в Word любое русское слово и перенесите его через буфер обмена в Блокнот. Получается следующий поразительный результат: если в Блокноте вставлять текст при включенной (для него) русской раскладке, то все вставляется правильно, а если при английской— получаются "кракозябры"! Для пущего эффекта можно вставить два раза подряд, переключив только раскладку. Еще интереснее получается при вставке в редактор Delphi: если вставлять из Word чистый русский текст, то все вставляется правильно (независимо от раскладки), а если перемешанный (текст программы с комментариями на русском) — вместо русских букв однн знаки вопроса! Мало того, даже в рамках самою Office можно попасть в безвыходную ситуацию: попробуйте скопировать из редактора Visual Basic что-нибудь русское, и вставить в текст документа Word, или наоборот.

Заметки на полях

Есть совершенно неочевидный "народный" рецепт того, как отчасти исправить в Windows ХР ситуацию с русским языком5: для этого в Панели управления надо щелкнуть на иконке Языки и региональные стандарты, зайти на вкладку Дополнительно, и отметить в окне Кодовые страницы таблиц преобразования абсолютно все пункты (включая IBM EBCDIC…. MAC… и т. п.). Система затребует дистрибутивный диск и после перезапуска, по крайней мере обмен между Блокнотом и Word заработает нормально. Естественно, кодовые страницы типе, например, "TeleText тайввньская" никак не могут оказывать влияния на русский язык, но, видимо, при этой операции подгружается какой-то модуль, который ранее отсутстаовал. Другой рецепт — вручную (или с помощью соответствующего REG-файла) внести изменения в реестр:

[HKEY_LOCAL_MACHINE\SOFTWARE\М ic гos oft\Windows NT\CurrentVersion \F0ntSubstitute3]

"Arial,0"="Arial,204"

"Courier New,0"="Courier New,204"

"Courier, 0"«="Courier New, 204"

"Times New Roman,0"="Times New Roman,204"

"Times,0"="Times New Roman,204"

Тем не менее проблемы с He-Unicode программами останутся и нет оснований полагать, что в платформе .NET ситуация не будет еще хуже. В мае 2005 годв появилась пре-бета-версия будущей Longhorn. Разумеется, окончательных выводов делать нельзя, но по свидетельству тех, кто ее пробовал, добиться нормальной поддержки русского в He-Unicode редакторах практически невозможно.

Наиболее запутывает пользователей, но и многое объясняет в логике разработчиков появление в Windows ХР дополнительной функции "переключения языка" и изменение в этой связи смысла понятия "раскладки" (Панель управления, запустить сервис Языки н региональные стандарты и зайти на вкладку Языки | Подробнее | Параметры клавиатуры | Смена сочета- ння клавиш). После экспериментов выясняется, что пункт Переключать языки ввода как раз раскладку-то и переключает, а пункт Переключать раскладки клавиатуры, судя по всему, не делает ничего. На самом деле с ним связана вот какая операция: для любого языка в принципе можно ввести несколько разных раскладок (для русского, например, машинописную или обычную компьютерную, они различаются регистром для отображения цифр и еще некоторыми особенностями). Таким образом, понятие "языка" обретает некоторую законченность. Путаница же тут происходит от того, что с точки зрения системы "русский машинописный" и "русский компьютерный" — такие же разные языки, как греческий с французским, и вводить отдельные понятия было совершенно ни к чему (а если уж и вводить, то, как мы говорили, до конца последовательно). Поскольку на практике о таком разделении труда между "языком" и "раскладкой" чаще всего никто и не подозревает (даже зная о такой возможности, очень немногие будут ее реально использовать), то отключение данного пункта ничего в системе не меняет, и идет только на пользу в случае использования имитатора нажатия клавиш переключения раскладки, как мы это делали в предыдущей главе. Напомним, что в этой книге слово "раскладка" употребляется в изначальном смысле, как переключение экранных шрифтов для операции ввода символов.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии