Заметки
Составные символы

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


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

Составные символы образуются сочетанием двух специальных символов, входящих в алфавит языка Object Pascal.

. , ; : ( ) { } < > [ ] # $ @ ^ = - + / * '

С некоторыми из них мы хорошо знакомы, потому что используем их каждый день, например:

:= <> .. <= >= //

Но есть составные символы, практически никем и никогда не использующиеся. Для начала посмотрим на процедуру PrnString из модуля Vcl.Printers (код процедуры приведен не полностью и в разных версиях Delphi может немного отличаться).

{ Print a string to the printer handling special characters. }
{$IF DEFINED(CLR)}
procedure PrnString(var Prn: PrnRec; Text: string; Len: Integer);
{$ELSE}
procedure PrnString(var Prn: PrnRec; Text: PAnsiChar; Len: Integer);
{$ENDIF}

{...}

begin
  L := 0;
  with Prn do
  begin
    while L < Len do
    begin
{$IF DEFINED(CLR)}
      case Text[L + 1] of
{$ELSE}
      case Text[L] of
{$ENDIF}
        #9: {...};
        #13: {...};
        #10: {...};
        ^L: {...};
      else
        Inc(L);
      end;
    end;
  end;
  {...}
end;

Интерес здесь представляет конструкция case, а точнее ветка ее кода ^L. Что же это такое? А это ни что иное, как альтернативный способ написания ASCII символов. Список (возможно неполный) подобных составных символов и их числовые соответствия приведены в следующей таблице.

Составной символ Код
Dec Hex
^@ 00 00
^A 01 01
^B 02 02
^C 03 03
^D 04 04
^E 05 05
^F 06 06
^G 07 07
^H 08 08
^I 09 09
^J 10 0A
^K 11 0B
^L 12 0C
^M 13 0D
^N 14 0E
^O 15 0F
^P 16 10
^Q 17 11
^R 18 12
^S 19 13
^T 20 14
^U 21 15
^V 22 16
^W 23 17
^X 24 18
^Y 25 19
^Z 26 1A
^[ 27 1B
^\ 28 1C
^] 29 1D
^^ 30 1E
^_ 31 1F
^` 32 20
^{ 59 3B
^| 60 3C
^} 61 3D
^~ 62 3E
^! 97 61
^” 98 62
^# 99 63
^$ 100 64
^% 101 65
^& 102 66
^’ 103 67
^( 104 68
^) 105 69
^* 106 6A
^+ 107 6B
^, 108 6C
^- 109 6D
^. 110 6E
^/ 111 6F
^0 112 70
^1 113 71
^2 114 72
^3 115 73
^4 116 74
^5 117 75
^6 118 76
^7 119 77
^8 120 78
^9 121 79
^: 122 7A
^; 123 7B
^< 124 7C
^= 125 7D
^> 126 7E
^? 127 7F

С моей (субъективной) точки зрения было бы лучше оформить код с соблюдением единого стиля, и вместо ^L написать #12. Ну да ладно, зато появился повод разобраться с этими символами.

Вот еще 2 пары редко встречающихся составных символов:

(* *) (. .)

Первые 2 символа являются альтернативными для специальных символов { }, и представляют собой многострочный комментарий. Комбинировать специальные и составные символы многострочных комментариев нельзя. Следующие записи являются эквивалентными по смыслу:

{
Многострочный
комментарий
}

(*
Многострочный
комментарий
*)

Последние 2 являются альтернативными для специальных символов [ ], и могут быть использованы для обозначения диапазона. Комбинировать специальные и составные символы диапазона можно. Следующие записи являются эквивалентными по смыслу:

var
  Arr: array[1..5] of Integer;

var
  Arr: array(.1..5.) of Integer;

var
  Arr: array(.1..5] of Integer;

var
  Arr: array[1..5.) of Integer;

Последние 3 записи выглядят непривычно, и вряд ли когда-нибудь начнут широко использоваться. Тем не менее, раз такие варианты допустимы, полезно будет знать и о них (например, в случае, если вам потребуется написать свой парсер для языка Object Pascal). Да и конструкции кода, аналогичные приведенному ниже, встретившиеся в чьем-нибудь коде, больше не повергнут вас в ступор.

const
  Arr: array(.1..5.) of AnsiChar = (
    ^%, ^~, ^^, ^#, ^@
  );

На этом все, всем творческих успехов!

При использовании материала - ссылка на сайт обязательна