i21sys/Docu/ru/Characters.odc

i21sysCharacters

DEFINITION i21sysCharacters;

	VAR
		Cap-: PROCEDURE (ch: CHAR): CHAR;
		ExtendedAsciiOf-: PROCEDURE (ch: CHAR): CHAR;
		HostFontsCHARSET-: INTEGER;
		IsCap-: PROCEDURE (ch: CHAR): BOOLEAN;
		IsDigit-: PROCEDURE (ch: CHAR): BOOLEAN;
		IsFirstIdentChar-: PROCEDURE (ch: CHAR): BOOLEAN;
		IsIdentChar-: PROCEDURE (ch: CHAR): BOOLEAN;
		IsLetter-: PROCEDURE (ch: CHAR): BOOLEAN;
		Lower-: PROCEDURE (ch: CHAR): CHAR;
		ToExtendedAscii-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		ToUnicode-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		ToUpper-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
		UnicodeOf-: PROCEDURE (ch: CHAR): CHAR;
		Upper-: PROCEDURE (ch: CHAR): CHAR;
		charSetName-: ARRAY 64 OF CHAR;

END i21sysCharacters.

Компонентный Паскаль в версии 2001 г. разрешает использовать в идентификаторах латинские буквы с диакритическими знаками, используемые в европейских языках (см. Сообщение о языке, раздел 3. Словарьиизображение, ссылка). Эти буквы имеют числовые коды между 128 и 255 (верхняя половина таблицы расширенной кодировки ASCII).

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

Модуль является модификацией старого модуля National, который использовался в аналогичных целях в предыдущих версиях сборки. Старый модуль National доступен в новых учебных сборках в целях совместимости, однако использовать его не рекомендуется.
Кроме того, в старых сборках был модифицирован системный модуль Strings (процедуры преобразования литерных цепочек), что иногда создавало неудобства. Теперь этот модуль возвращён к той форме, какую он имеет в оригинальном дистрибутиве Блэкбокса, а соответствующие процедуры включены сюда, в модуль i21sysCharacters.

При разработке промышленного ПО этот модуль использовать не рекомендуется, а для обработки данных, содержащих национальные буквы следует явно использовать соответствующий конкретный модуль (для кириллицы это i21sysCyrillics); такие модули будут корректно работать в любой сборке Блэкбокса.

Общее ограничение состоит в том, что для национального алфавита должна существовать соответствующая кодовая таблица в пределах расширенного ASCII (коды до 255). Правильность отображения национальных букв на экране зависит от установок операционной системы и наличия соответствующих шрифтов.

Модуль i21sysCharacters никакой конкретной информации о литерах не содержит, это чисто интерфейсный модуль. Вся конкретная информация о допустимых литерах и преобразованиях из расширенного ASCII в Юникод и обратно "зашивается" в отдельные независимые модули по стандартной схеме (см. i21sysLatin1, i21sysCyrillics и т.п.), обращения к этим модулям прописываются в исходнике i21sysCharacters (в списке импорта), а затем линкуется соответствующий BlackBox.exe. Подробные инструкции даны в отдельномдокументе.

В настоящее время имеются следующие вспомогательные модули с поддержкой конкретных наборов литер:

i21sysLatin1  в точности набор литер, определённый в Сообщении о языке.
i21sysCyrillics  кириллица в кодировке Win-1251; в основном варианте поддерживаются все литеры русского, украинского и белорусского языков. (Это же модуль содержит необходимые константы для поддержки сербского и македонского алфавитов.)
Модули поддержки для, например, армянского или грузинского языков можно сделать по образцу i21sysCyrillics.


charSetName-: ARRAY 64 OF CHAR;
Название набора литер, фиксируется произвольно в соответствующем конкретном модуле.  

HostFontsCHARSET-: INTEGER;
Числовой код для передачи операционной системе.
0 для Latin-1, 
1 для кириллицы Win-1251.

Cap-: PROCEDURE (ch: CHAR): CHAR;
Преобразует литеру ch в соответствующую заглавную. ch может быть юникодной литерой.

ExtendedAsciiOf-: PROCEDURE (ch: CHAR): CHAR;
Преобразует юникодную литеру в соответствующую литеру расширенного ASCII.
Литеры из расширенного ASCII преобразуются в себя.
Неизвестные юникодные литеры преобразуются в "?".

IsCap-: PROCEDURE (ch: CHAR): BOOLEAN;
Проверяет, является ли ch заглавной буквой. ch может быть юникодной литерой.

IsDigit-: PROCEDURE (ch: CHAR): BOOLEAN;
Проверяет, является ли ch цифрой. (Литеры из юникодного диапазона дают FALSE.)

IsFirstIdentChar-: PROCEDURE (ch: CHAR): BOOLEAN;
Проверяет, является ли ch допустимой первой литерой идентификатора.

IsIdentChar-: PROCEDURE (ch: CHAR): BOOLEAN;
Проверяет, является ли ch допустимой литерой идентификатора.

IsLetter-: PROCEDURE (ch: CHAR): BOOLEAN;
Проверяет, является ли ch известной буквой.

Lower-: PROCEDURE (ch: CHAR): CHAR;
Преобразует литеру ch в соответствующую строчную. ch может быть юникодной литерой.

ToExtendedAscii-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
Каждая литера из цепочки in преобразуется с помощью ExtendedAsciiOf.

ToUnicode-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
Каждая литера из цепочки in преобразуется с помощью UnicodeOf.

ToUpper-: PROCEDURE (IN in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
Каждая литера из цепочки in преобразуется с помощью Upper.

UnicodeOf-: PROCEDURE (ch: CHAR): CHAR;
Преобразует литеру из расширенного ASCII в соответствующую юникодную.
Юникодные литеры преобразуются в себя.

Upper-: PROCEDURE (ch: CHAR): CHAR;
То же, что Cap.