уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

клавиатураБуквально на днях снова пришлось возвратиться к теме о клавиатурных шпионах, виртуальных и скан-кодах клавиш и прочей работе с клавой.

Признаться до этого момента я до конца себе не представлял, что за проблемы стоят перед разработчиками, которые пишут, например редакторы с автоматическим переключением кодировок, да даже не кодировок — просто раскладок! До сих пор, имея под рукой дорожайшую и всеми (ну или большинством любимую) Delphi 7, можно было без особых проволочек и напрягов накидать небольшого клавиатурного шпиончика или просто программку, считывающую виртуальные коды клавиш. Но в Delphi 2009-2010 заявили Unicode. Идея безусловно отличная, я бы даже сказал, крайне необходимая в современных условиях, но как оказалось воплощение этой идеи было не самым удачным. О чем собственно и заявляли не раз в своих блогах программисты, пробующие перевести свои проекты из Delphi 7 в Delphi 2009.  И вот теперь, когда кругом Unicode, посмотрим какая собственно проблема возникает? 

Так как тема поста заявлена довольно широкая, то видимо рассуждения и примеры придётся расписывать на несколько частей. И начать бы стоит с самого интересного, на мой взгляд, вопроса — истории кодировок в принципе.  Узнаем историю — в дальнейшем при разработке будет меньше возникать вопросов типа «А почему так?» Которые, кстати я себе не раз задавал, пока разобрался, что и к чему относиться. Итак, история кодировок.

1. Первые кодировки символов

Как дать понять груде железа под названием компьютер, что перед ним некий конкретный язык? Да ещё и сделать так, что бы он подставил в нужные места нужные символы?

louis-brailleРешение этой задачи оказывается известно давным-давно, ещё со времен слепого французского врача Луи Брайля (1809-1852 гг.) , который ещё будучи мальчиком в коротких штанишках, придумал последовательную систему рельефных точек, кодирующих буквы алфавита, цифры и знаки препинания для слепых — несколько дополненная азбука Брайля используется и в наши дни.

Базовый элемент системы Брайля содержит шесть позиция-ячеек, каждая из которых может быть выпуклой или плоской, т.е., проведя простейшую математическую операцию можно сказать, что всего в азбуке Брайля было закодировано 2^6 = 64 символа (видали, когда ещё двоичную системы во всю юзали?), однако Брайлем предусмотрен интересный механизм практически неограниченного расширения количества кодируемых символов. Для этого употребляются специальные коды-переключатели (Shift-коды). Наличие такого переключателя может, например, свидетельствовать, что все последующие знаки — это цифры, а не буквы и т.д., до тех пор пока не встретится другой подобный знак (не напоминает аналоги. с HTML?). Другая разновидность переключателей (Escape-кодов) действует только на один знак после такого кода, и тоже впервые введена в азбуке Брайля.

Теперь можете провести небольшую аналогию с современной клавиатурой:  Shift-код — очень напоминает включенный CapsLook, а Escape-код — зажатый шифт. Конечно, сказать о том, что Брайль был настолько суров, что разработал кодовую таблицу для первых компьютеров — верх глупости, но тем не менее, разработанная им система кодирования, хоть и в сильно измененном виде, но используется по сей день в современных ЭВМ.

Emile_BaudotНесмотря на это, предшественником современных компьютерных кодировок принято считать коды,  разработанные в 1874 году Эмилем Бодо, усовершенствованные позднее Дональдом Мюрреем и принятые в качестве международного стандарта в 1931 году. Официальное название кода Бодо — International Telegraph Alpabet #2, ITA-2. Он применялся в телетайпных аппаратах и, соответственно в первых компьютерах.

КодыБодо — пятибитовые, поэтому количество представленных символов ограничено 32, чего для всех необходимых символов не хватает. Для увеличения этого числа использовались опять же Shift-переключатели. Основная проблема заключалась в том, что Shift-переключатель действовал до тех пор, пока не встречался другой переключатель, отменяющий предыдущий. Поэтому, если какое-либо предложение заканчивалось цифрой, то следующее за ним предложение представляло собой бессмысленный надор цифр до тех пор пока не встречался очередной Shift-переключатель.

В 1963 году возник, а в 1967 году утвержден в качестве стандарта American Standard Code for Information InterchandgeASCII, который и является по сей день основой всех кодовых таблиц, устанавливая символы с номерами 0-127 (а точнее, 32-127, т.к. до 32 символа располагаются команды и могут интерпретироваться по разному). У истоков ASCII стояла фирма AT&T, а также IBM.

Русские разработчики кодовых таблиц тоже не остались в стороне и в середине 70-х годов возникла KOI, в которой русские буквы во второй половине таблицы ставились на такие места, чтобы при вычитании числа 128 из кода получалась соответствующая по звучанию английская буква, причем в противоположном регистре, чтобы отличить русский текст от английского. Так, например, строка «Привет» превратилась бы в «pRIVET». Сделано это было потому, что первые почтовые серверы были семидитовыми, т.е. могли передавать только ASCII. KOI-8 существовала в виде общесоюзного стандарта и даже чуть не была утверждена в качестве международного, но «чуть» не считается.

Время шло,  компьютерное дело расширялось, и в нашей стране и в родственных странах была разработана масса кодировок: украинская, болгарская, польская и пр.Среди них наибольшую известность получили «основная» (ISO/IEC 8859-5-88) и «альтернативная»  (MS-DOS, CP866). Как мы теперь уже знаем, прочное место в наших первых «персоналках» заняла именно «альтернативная кодировка», а «основная» канула в небытие.

CP866 едва ли не самая продуманная из существующих кодовых таблиц — в ней предусмотрительно были сохранены все положения символов из ASCII, в результате чего, английский текст выглядел абсолютно читабельным при любой кодировке страницы.

И тут в историю семимильными шагами входит корпорация Microsoft…

2. Кодировки эпохи Windows

Петр КвитекС развитием Windows разработчики придумали ещё одну кодировку, как обычно забив болт на все национальные стандарты и традиции (а собственно зачем их учитывать, если США — это пуп Земли?). Её создатели логично рассудили, что символы псевдографики при наличии графических редакторов (в т.ч. и от Microsoft) как-то особенно никому не нужны. Кириллическая азбука заняла почётные последние 64 ячейки, кроме, почему-то букв «Ё» и «е». Новая кодировка получила опять же логичное название — Windows 1251 (Win1251), которая и по сей день используется и ещё долго будет использоваться, в т.ч. и веб-мастерами.

Что самое примечательное, так это то, что внедрением и СР866 и Win1251 в 1995 году занимался один и тот же человек — россиянин Петр Квитек.

На самом деле на сегодняшний день действуют параллельно пять однобайтовых кириллических кодировок, с которыми мы постараемся познакомиться в будущем.

Вот теперь посмотрим — как же была решена проблема кодировок в международном отношении?

Unicode

Введение двухбайтной кодировки было задумано хорошо, а выполнено как обычно через…короче «как всегда». Разработчики Microsoft зачем-то разделили понятие «языка» и «раскладки». Зачем? Ведь отображение шрифта на экране однозначно определяется кодовой страницей, а при вводе — раскладкой. Чего за «язык» такой? Все дело в том, что таким образом разработчики Microsoft пытались обеспечить поддержку многоязычных документов и  даже в чем-то преуспели.

Теперь непосредственно про Unicode. Вообще двухбайтный Unicode ASCII организован элементарно просто и логично: если первый байт равен нулю, то второй соответствует начертанию символа из таблицы (или, что тоже самое, английскому языку). Если же первый байт равен, например 4, то следующий байт представляет собой символ из кириллицы и т.д. Русские буквы в таблице располагаются подряд, начиная со значения младшего байта, равного 16. Ну а буквы «Ё» и «е» как обычно — отдельно. Всякие скобки, тире выбираются из отдельных таблиц со своим значением первого байта.

Логично составлена таблица? По-моему вполне — здесь и сохранение ASCII и четко продуманная структура — взял старший байт — определил что за язык. Но, как и в любой бочке меда, нашлась своя ложка дёгтя.

Unicode и Win32

Чтобы не утомлять Вас лишними примерами из прошлого Windows, но, тем не менее понять «глючность»  использования unicode в win32, вспомните или воспроизведите такой простой пример. Откройте Word и наберите там какой-нибуль кусок кода с комментариями на русском, а потом вставьте этот кусок текста в Delphi 7. Что окажется на месте русских букв? Правильно «кракозябры». А почему? Не потому, что ubicode не доработан — там все логично и понятно, а потому, что разработчики Windows перестарались при разработке новых версий операционной системы. И теперь разработчикам приходится долго и упорно карпеть над программным обеспечением, способным «на лету» схватывать кодировки символов и правильно их выводить на экран.

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

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии