Программирование для гуманитариев

Примитивные символьные данные

Разбить на страницы
Показывать лекцию целиком

6.1 Кодировки

6.1.1. Представление символов целыми числами

Как уже указывалось в лекции 5, все символы в ЭВМ представлены в виде целых чисел. Порядок соответствия литер символов целым числам называется кодировкой (или кодовой таблицей, таблицей символов). В зависимости от размера таблицы символов разрядность этих целых чисел равна 1 байт (для кодировок EBCDIC и всех вариантов ASCII) , 2 байта (для кодировок Unicode) или переменной длины (UTF-8, UTF-7 и др.). Более подробно о кодировках будет сказано ниже.

6.1.2. Кодировки

Вначале возникли кодировки, включающие в себя десятичные цифры, буквы (прописные и строчные) латинского алфавита, сокращения английского языка (такие как "" и "@"), знаки препинания и специальные символы. На основе этих символов возникли кодировки EBCDIC (более старая) и ASCII (более новая, используемая до сих пор). Преимущества кодировки ASCII в том, что расположение латинских букв в ней не только упорядочено по алфавиту (как это сделано во всех кодировках), но и расположены эти буквы "без разрывов", то есть присутствует сплошная нумерация букв от A до Z и от a до z. Это позволяет лучше реализовать алгоритмы сравнения символов и сортировку строк символов.

Замечание. Из-за особенностей русского алфавита, реализовать кодирование букв подряд не удается ни в одной из кодировок. Дело в том, что кириллическая буква "е" есть только в русском алфавите, но не входит в состав "стандартных" кириллических символов. Наиболее "правильно" русский алфавит представлен в кодировке ANSI cp 1251, USSR GOST и Unicode.

Кодировки EBCDIC и ASCII являются 7-ми битными кодировками, хотя они и занимают 1 байт. Самый старший (нулевой) бит является либо резервным, либо используется для контроля четности при передаче данных.

6.1.3. Восьмибитные кодировки

Однако в кодировке ASCII отсутствуют даже некоторые символы (умляуты) западноевропейских алфавитов. Что же говорить о кириллических символах... Для решения этой проблемы были созданы расширенные кодировки ASCII, в которых для представления символов используются все восемь бит. Это доводит количество закодированных символов до 256. Среди реализаций кириллических символов в расширенных ASCII кодировках можно отметить кодировки OEM 866 (MS-DOS), ANSI cp 1251 (Windows) и KOI8-R (все клоны UNIX и VAX).

Относительно полно концепция "сплошной нумерации" применяется в кодировке USSR GOST и ANSI cp 1251. Кодировка USSR GOST должна была заменить кодировку OEM 866 на компьютерах, производимых в СССР. Однако, по ряду причин, этого не произошло, и в настоящее время эта кодировка является "мертвой".

Исторически первой кодировкой с кириллическими символами была кодировка KOI8. В ней латинские буквы с кодами 128-255 были заменены кириллическими символами в той же транскрипции. К сожалению, эта кодировка сейчас почти сошла на "нет" по следующим причинам:

  • Этот стандарт не поддержали производители компьютерного оборудования за рубежом;
  • Отсутствие "сплошной" нумерации кириллического алфавита;
  • Невозможность совместного использования кириллицы и умляутов;
  • "Неправильная" реализация символов псевдографики.
  • Следом за этой кодировкой на российские компьютеры вначале пришла болгарская, а затем - и альтернативная русская кодировка ДОС, впоследствии переименованная в OEM 866. Преимущества этой кодировки:

  • Компактность;
  • Частично сплошная нумерация символов;
  • Полная совместимость с MS-DOS;
  • Корректная реализация символов псевдографики;
  • "Нормальная" обработка символов на всех платформах;
  • Наличие коммерческих и некоммерческих знакогенераторов для этой платформы.
  • Недостатками этой кодировки являются:

  • Привязанность к MS-DOS, вместе с которой эта кодировка "умирает";
  • Невозможность совместного использования кириллицы и умляутов;
  • Общий недостаток всех восьмибитных кодировок - ограничение на кодирование только 256-ю символами.
  • Кодировка ANSI cp 1251 получила широкое распространение из-за продвижения продукции корпорации Microsoft, прежде всего Microsoft Windows и Microsoft Word, на Российский рынок. Эта кодировка имеет большие преимущества перед другими кириллическими кодировками:

  • Компактность;
  • Сплошная нумерация символов (кроме "е" и "Ё");
  • Стандартность.
  • Однако у этой кодировки есть недостатки:

  • Привязанность в основном к платформе Microsoft Windows;
  • Некорректная обработка многими программами символов с номерами 254 и 255 ("ю" и "я");
  • Невозможность совместного использования кириллицы и умляутов.
  • 6.1.4.Многоразрядные кодировки

    К "многоразрядным" кодировкам относятся кодировки Unicode и UTF. Рассмотрим историю их возникновения.

    Уже в начале 90-х годов XX века стало ясно, что 256 чисел для кодирования символов очень мало. Например, с помощью этих чисел нельзя кодировать все символы европейских алфавитов. Поэтому появились русские, западноевропейские, восточноевропейские, балтийские, не говоря уже об арабских, турецких кодировках и кодировках на иврите, каждая из которых содержала 256 символов. Что же говорить о вьетнамском алфавите, корейских, японских и китайских иероглифах, каждые из которых содержат более 256 символов? Для этой цели был разработан специальный стандарт на кодировку символов 16-ти разрядными целыми числами (2 байта) - Unicode. Полностью с помощью 16-ти разрядных чисел можно представить более 65 тысяч символов, что с избытком хватит для кодирования всех литер основных языков земли.

    При всей полезности кодировки символов Unicode следует отметить ее недостаток - вдвое больший размер кода, чем при использовании 8-ми разрядных кодировок. Этот недостаток особенно заметен при использовании только латинских букв. Поэтому вскоре был принят стандарт на кодировку UTF. В ней символы кодируются числом переменной разрядности: 7-ми разрядными кодами ASCII для латинских букв и 16-ти разрядными символами Unicode для всех остальных литер алфавита. За эту "экономию" приходится расплачиваться людям, пишущих на отличном от английского языка - работа с символами в кодировке UTF более сложная, чем в других кодировках. Это надо помнить!

    Примечание. Кодировка UTF-8 стала стандартом в операционной системе Linux и в Интернете. При разработке приложений в Microsoft Window, начиная с версии 98, также широко используются кодировки UTF-8 и UTF-7.

    6.2. Примитивные символьные данные

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

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

    Символьные типы данных
    Тип данных Префикс/Окончание Разрядность регистров/длина Примечание
    Quick Basic
    STR <идентификатор>$ Переменная длина (до 255 символов) Для хранения 1 символа в кодировке ASCII. Не защищен от изменений.
    VB Script
    Variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    Java
    char с 2 байта Для хранения одного символа в кодировке Unicode
    String str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    javascript
    variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    C/C++
    char с 1 байт Для хранения одного символа в кодировке ASCII (со знаком)
    unsigned char uc 1 байт Для хранения одного символа в кодировке ASCII (без знака)
    char * pc от 2 до 4 байт Указатель на массив (переменной длины)
    unsigned char * puc от 2 до 4 байт Указатель на массив (переменной длины)
    C/C++ Windows API
    BYTE b 1 байт Эквивалентен unsigned char
    NPSTR npsz 2 байта Эквивалентен char near *
    LPSTR lpch 4 байта Эквивалентен char far *
    LPCSTR lpsz 4 байта Эквивалентен const char far *
    C++ MFC
    CString cstr, str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    C++ Classlib
    string str Переменная длина Класс для хранения символов в кодировке ASCII (и Unicode?). Защищено от изменений!

    Обычно, в начале работы программы, весь массив символьных данных заполняют нулевой константой (она обозначается на языке Си как " \0 "). Это делается в расчете на то, что признаком конца символьных данных является не признак конца строки, не пробельный символ, а именно этот нулевой символ. Поэтому заполнение массива нулевыми символами заведомо гарантирует, что не случится ошибка типа размещения символьных данных за границами массива, после одиночного нулевого символа.

    Что касается максимальной длины символьной строки, то она может принимать значения от 255 (языки "Паскаль", "Quick Basic", СУБД dBase III+), 2047 (Multi Edit и часть редакторов) и даже ~ 64 Кбайт (величина сегмента памяти процессора x86). Но, следующий нехитрый расчет показывает, что использовать длину строки более 2000 (80*25) символов нерационально (она все равно не уместится на экране).

    Также автор советует не доверять своей памяти в использовании максимальной длины строки, а определить ее в виде константы целого значения (например, константного типа const unsigned short на языке Си).

    Следующим "джентльменским соглашением" при работе с символьными данными является неизменность значений массивов символьных данных (кроме, возможно, первого массива в выражении) при символьных вычислениях. Вот почему большинство символьных функций принимает тип аргументов как const char * (указатель на начало массива символьных констант). Именно к этому типу необходимо принудительно приводить Ваши переменные в программе!

    Итак, организация работы с "примитивными" символьными массивами данных следующая:

  • Создается (функцией malloc ) или объявляется (в начале блока программ) необходимое количество символьных массивов-переменных;
  • Они инициализируются нулевыми символами (функцией memset );
  • Производятся операции с символьными данными:
  • ввод;
  • присвоение им константных значений;
  • замена, добавление или "обрезание" значений этих переменных;
  • вывод символьных значений;
  • Для созданных переменных при завершении программы необходимо освободить память, размещенную при их создании (функцией free ).
  • Замечание: некоторые функции и операторы для работы с символьными данными (такие как MID$ в Quick Basic-е или Replace в некоторых библиотеках C/C++) могут изменять значения внутри массива символьных данных. Для соблюдения "джентльменского соглашения", необходимо сначала сделать копию изменяемой строки в виде отдельного массива, а уже в ней - изменять содержимое массива. Этот метод и безопаснее (в том числе и для противодействия хакерским атакам), и экономнее (память из-под ненужных символьных переменных можно сразу освободить). Замечание. Необходимо всегда следить, чтобы индекс символьной переменной-массива не выходил за границы массива. Обычно при этом генерируется ошибка операционной системы, которая может быть перехвачена хакером, открывающая таким образом доступ к Вашей операционной системе и Вашему компьютеру. Чтобы этого не произошло, автор советует ограничить использование функций mem*** и полностью исключить использование функций str*** (за исключением функции strlen ), заменив их функциями: strn*** (на языке Си). Звездочками обозначено окончание функций.

    Собственно стандартные функции для работы с символьными типами данных (в том числе и с примитивными данными) на языках Си и C++, вместе с комментариями, приведены в таблице 6.2.

    Функции для работы с текстом
    Функция/Метод Описание Пример
    Язык Си. Функции ANSI C
    #include <string.h> Заголовочный файл для этих функций
    int strlen( char *str ); Возвращает длину строки str1 (позицию его символа \0).
    char* strerror( char *str );
    char *strncat( char *str1, char *str2, unsigned int n ); Конкатенация строки str1 и str2, но в строку n записывается не более n символов. Возвращается значение строки str1 или NULL при неудаче конкатенации.
    int strncmp( char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2.
    char *strncpy( char *str1, char *str2, unsigned int n ); Копирует строку str2 в строку str1, но не более чем n символов. Возвращается значение строки str1 или NULL при неудаче копирования.
    char *strpbrk( char *str1, char *str2 ); Ищется первое вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strrchr( char *str1, char *str2 ); Ищется последнее вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strspn( char *str1, char *str2 ); Ищется первое вхождение символа, которого нет в строке str2, в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strstr( char *str1, char *str2 ); Ищется первое вхождение подстроки str2 в строке str1. Возвращается указатель на заданную подстроку или NULL в случае ее необнаружения.
    char *strtok( char *str1; char *str2 ); Функция разбивает строку str1 на слова, вставляя после каждого из них символ '\0'. Символы, являющиеся разделителями слов, перечислены в строке str2. При первом вызове функция возвращает указатель на str1. При последующем вызове (с параметром str1 == NULL) она возвращает указатели на другие слова в строке str1. Функция возвращает NULL, если все слова закончились.
    char *memchr( char *buf, char sim, unsigned cnt ); Функция ведет поиск первого вхождения символа sim в не более чем cnt символов с начала строки buf. Возвращает указатель на символ sim в случае его нахождения или NULL если он не найден.
    int memcmp( char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memcpy( char *dst1, char *src2, unsigned int n ); Копирует строку src2 в строку dst1, но не более чем n символов. Возвращается значение строки dst1. Реализация функции гарантирует, что перекрывающие участки будут правильно обработаны.
    Функции TURBO C и MSC (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    int memicmp(char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Регистр символов игнорируется. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memmove(char *buf1, char *buf2, unsigned cnt ); Функция полностью идентична функции memcpy. При копировании перекрывающихся участков гарантируется, что эти участки скопируются правильно.
    char *memset( char *dest, char sim, unsigned cnt ); Функция присваивает буферу dest повторяющиеся cnt число раз значения символа sim. Возвращаемое значение - указатель на массив dest. Примечание: с помощью этой функции можно задать строку, содержащую в себе только пустые символы: '\0'. Этого невозможно сделать с помощью команды strnset.
    char *strnset( char *str1, char sim, unsigned int n ); Функция присваивает буферу str1 повторяющиеся не более чем n число раз значения символа sim. Возвращаемое значение - указатель на массив str1.
    int strnicmp(char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2. Регистр символов игнорируется.
    char *strlwr( char *str ); Переводит все символы в строке str в нижний регистр. Возвращает значение указателя на строку str.
    char *strrev( char *str ); Функция меняет порядок следования символов в строке str. Возвращает значение указателя на строку str.
    char *strupr( char *str ); Переводит все символы в строке str в верхний регистр. Возвращает значение указателя на строку str.
    Функции TURBO C (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    char *strerror( int number );
    Язык Си. Функции ANSI C
    #include <stdio.h> Заголовочный файл для этих функций
    int sprintf( char *buffer, char *format_string[, arguments]); Функция форматирует и записывает в строку buffer сформированную строку символов, задаваемой шаблоном-строкой format_string. Обозначение метасимволов в шаблоне аналогично программе printf.

    В таблице 6.3 приведены функции работы со скалярами и массивами скаляров на языке Perl.

    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Perl Функции для работы со скалярами
    chomp chomp СПИСОК Удаляет из каждого строкового элемента замыкающий символ завершения записи, определенного значением переменной $/ (по умолчанию - \n). Возвращает общее количество удаленных символов. Список может состоять из одной переменной. При использовании без параметра функция эквивалентна chomp $_ .
    chop chop СПИСОК Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение - удаленный символ из последнего элемента списка. Список может состоять из одной переменной. При использовании без параметров эквивалентно вызову chop $_ .
    chr chr ЧИСЛО Возвращает символ по заданному числовому коду таблицы символов. При использовании без параметров эквивалентно вызову chr $_ .
    crypt crypt ТЕКСТ, ШИФР Шифрует ТЕКСТ с использованием заданного параметра шифра. Обратной функции дешифровки не существует.
    hex hex ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатеричное число и вычисляет его десятичный эквивалент. При использовании без параметров вызов аналогичен вызову hex $_ .
    index index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию первого вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается с заданной позиции в строке (нумерация символов в строке начинается с "0").
    lc lc ВЫРАЖЕНИЕ, Функция преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров функция аналогична вызову lc $_ .
    lcfirst lcfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову lcfirst $_ .
    length length ВЫРАЖЕНИЕ Возвращает количество байтов в строке, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров функция эквивалентна вызову length $_ .
    oct oct ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов 0x, то его содержимое интерпретируется как шестнадцатеричное число. При использовании без параметров вызов функции аналогичен вызову oct $_ .
    ord ord ВЫРАЖЕНИЕ Возвращает числовой ASCII код первого символа строки, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров вызов функции аналогичен вызову ord $_ .
    pack pack ШАБЛОН, СПИСОК Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру.
    reverse reverse СПИСОК В списковом контексте возвращает список значений, состоящий из элементов, заданным параметром СПИСОК списка, но в обратном порядке, начиная с последнего символа. В скалярном контексте соединяет все элементы списка в одну строку, состоящую из символов полученной строки, но в обратном порядке.
    rindex rindex СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию последнего вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается до заданной позиции в строке (включая символ в этой позиции).
    sprintf sprintf ФОРМАТ, СПИСОК Возвращает строку, представляющую собой форматный вывод списка значений, определенного параметром СПИСОК, в соответствии с заданной параметром ФОРМАТ строкой формата. Символы форматирования соответствуют функции форматирования языка Си printf.
    substr substr СТРОКА, СМЕЩЕНИЕ[, ДЛИНА[, ЗАМЕЩЕНИЕ]] Находит и возвращает из параметра СТРОКА, подстроку длиной, равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если значение СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение ДЛИНА отрицательно, то от конца строки отсекаются количество символов, равное абсолютному значению этого параметра. Если задан строковый параметр ЗАМЕЩЕНИЕ, то найденная подстрока замещается ею в параметре СТРОКА, который в этом случае должен быть l-Значением.
    uc uc ВЫРАЖЕНИЕ, Функция преобразует все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову uc $_ .
    ucfirst ucfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову ucfirst $_ .
    Лексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение.
    Perl Функции для работы со скалярами (поиск и замена фрагментов)
    pos pos СТРОКА pos Возвращает значение указателя позиции в строке после последней выполненной для нее операции поиска по образцу: m//g. Если используется в левой части операции присвоения, то изменяет значение указателя, влияя на \G в регулярном выражении. При использовании без параметров данный вызов эквивалентен вызову: pos $_.
    quotemeta quotemeta ВЫРАЖЕНИЕ quotemeta Возвращает строку, в которой перед каждым неалфавитно-цифровым символом поставлена обратная черта. Значение параметра: ВЫРАЖЕНИЕ - интерпретируется как строка. (Внутренняя функция реализации управляющего символа \0 в строках в двойных кавычках). При использовании функции без параметров эквивалентно вызову quotemeta $_.
    split split /ОБРАЗЕЦ/[.ВЫРАЖЕНИЕ[.ПРЕДЕЛ]] split Разбивает строку, являющуюся значением параметра: ВЫРАЖЕНИЕ, на массив строк, с использованием разделителя, определяемым регулярным выражением в параметре: ОБРАЗЕЦ. В списковом контексте возвращает полученный массив, в скалярном контексте - количество найденных строк разбиения. Если задан параметр: ПРЕДЕЛ, разбивает на не более чем заданное этим параметром число строк. Если параметр: ВЫРАЖЕНИЕ - не задан, то используется внутренняя специальная переменная интерпретатора Perl $_, Если не задан образец, то разбивает по пробельным символам. При использовании без параметра эквивалентна split /\s+/. $_. Операция split - антагонист операции: join.
    study study ВЫРАЖЕНИЕ study Оптимизирует строковые данные параметра: ВЫРАЖЕНИЕ - для дальнейшего использования в повторных операциях поиска по образцу. В цикле с несколькими операциями поиска может сэкономить время выполнения. При использовании без параметров функция эквивалентна: study $_.
    Perl Функции для работы с массивами скаляров
    delete delete ВЫРАЖЕНИЕ Удаляет из массива скаляров его элемент или фрагмент, заданный параметром: ВЫРАЖЕНИЕ. Если удаляется последний элемент массива, то автоматически изменяется длина массива, если удаляются элементы из его середины, то оставшиеся элементы не сдвигаются (для сдвига используйте функцию splice()), а соответствующий "удаленный" элемент принимает неопределенное значение. В списковом контексте возвращает список удаленных элементов, а в скалярном - их количество. Если удаляемых символов в массиве нет, то возвращает неопределенное значение. Функция delete работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    exists exists ВЫРАЖЕНИЕ Проверяет, был ли когда-либо инициализирован в массиве скаляров элемент, заданный параметром: ВЫРАЖЕНИЕ, например, $array[3], даже если сейчас его значение не определено. Если да, то возвращает значение "истина", иначе - "ложь". Функция exist работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    pop pop МАССИВ pop Удаляет из массива скаляров последний элемент и возвращает его значение. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен pop @ARGV, а в подпрограмме pop @_.
    push push МАССИВ, СПИСОК Рассматривает массив скаляров, заданный параметром: МАССИВ, как стек и добавляет после его последнего элемента элементы списка, заданные параметром: СПИСОК. Возвращает количество элементов полученного массива.
    shift shift МАССИВ shift Удаляет из массива скаляров первый элемент и возвращает его значение. После удаления элементы оставшиеся элементы сдвигаются влево: второй элемент становится первым, третий - вторым и т.д. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен shift @ARGV, а в подпрограмме shift @_.
    splice splice МАССИВ, НОМЕР[, КОЛИЧЕСТВО[, СПИСОК]] Удаляет из массива количество элементов, заданное значением параметра: КОЛИЧЕСТВО, начиная с элемента, заданное значением параметра: НОМЕР. В случае задания параметра СПИСОК заменяет указанные в нем элементы списка. В списковом контексте возвращает удаленные элементы; в скалярном контексте - последний удаленный элемент. Если параметр:КОЛИЧЕСТВО не задан, то удаляются все элементы после элемента с номером, определенным значением параметра: НОМЕР.
    unshift unshift МАССИВ, СПИСОК Добавляет элементы списка, определенного параметром: СПИСОК, в начало массива, заданного параметром МАССИВ. Выполняет действия, противоположные действиям функции shift.
    grep grep БЛОК СПИСОК grep ВЫРАЖЕНИЕ, СПИСОК
    join join ВЫРАЖЕНИЕ, СПИСОК Рассматривает все элементы списка, определенного параметром: СПИСОК, как строковые значения, соединяет их в одну строку, вставляя между ними разделитель, равный значению параметра: ВЫРАЖЕНИЕ, и возвращает полученную строку.
    map map БЛОК СПИСОК map ВЫРАЖЕНИЕ, СПИСОК
    pack pack ВЫРАЖЕНИЕ, СПИСОК
    reverse reverse СПИСОК В списковом контексте возвращает список значений элементов, заданный параметром: СПИСОК, в обратном порядке, начиная с последнего элемента. В скалярном контексте соединяет все элементы в одну строку и возвращает строку, в которой символы расположены в обратном порядке, начиная с последнего символа.
    sort sort [ПОДПРОГРАММА] СПИСОК sort [БЛОК] СПИСОК Сортирует список значений, заданный в параметре: СПИСОК. Если параметры БЛОК и ПОДПРОГРАММА не заданы, то используется стандартная процедура сравнения строковых данных. Если они заданы, то операторы блока или подпрограммы используются в качестве процедуры сравнения при сортировке элементов списка. В этом случае в теле блока или подпрограммы в последнем операторе следует использовать операцию <=> или cmp в зависимости от сортировки соответственно числовых и строковых данных. Возвращает список, элементами которого являются отсортированные элементы исходного списка.
    unpack unpack ШАБЛОН, ВЫРАЖЕНИЕ

    [Пример 01]

    Примеры выражений

    Пусть нам надо вставить во фразу: "Привет, <имярек>! С добрым утром." - вместо <имярек> человеческое имя, например, Света. Приводятся примеры фрагментов программ, написанных на языках Си, Perl и Quick Basic:

    Си:

    /* Определение констант и переменных */
    const unsigned short maxstringlength = 255;
    char strSveta[] = "Света";
    char strResult[maxstringlength];
    /* Заполнение результирующей переменной нулями*/
    memset( strResult, '\0', (size_t) maxstringlength);
    /* Символьные вычисления */
    strncpy( strResult, "Привет ", maxstringlength );
    strncat( strResult, (const char *)strSveta, maxstringlength );
    strncat( strResult, "! С добрым утром.", maxstringlength );

    Perl:

    # Определение переменной: <имярек>.
    $ImyaRek = 'Света';
    
    # Определение результирующей строки.
    $strResult = "Привет, $ImyaRek! С добрым утром.";

    Quick Basic:

    REM Определение переменной: <имярек>.
    ImyaRek$ = "Света"
    REM Символьные вычисления.
    strResult$ = "Привет " + ImyaRek$ + "! С добрым утром."

    6.3. Резюме

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

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

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

    6.4. Глоссарий

    Термин Английский термин Разъяснение
    кодовая таблица code table 1. См. кодировка.
    таблица символов code table 1. См. кодировка.
    кодировка codepage Порядок соответствия литер символов целым числам.
    длина кодировки codepage length Разрядность целого числа, используемого для представления литер. Используются однобайтные, двухбайтные кодировки и кодировки переменной длины.
    EBCDIC-код EBCDIC Кодировка латинских символов, десятичных цифр, знаков препинания, пробельных и специальных символов на основе 7-ми битного кода. Не имеет сплошной кодировки символов. Данная кодировка применялась в мэйнфреймах IBM-360/370 и советских ЭВМ серии ЕС. В настоящее время безнадежно устарела.
    десятичные цифры decimal digits Цифры, применяемые в десятичной системе счисления. Содержат в себе литеры от 0 до 9.
    латинский алфавит Latin alphabet Прописные и строчные буквы от A до Z (всего 52 символа). Латинский алфавит используется в латинском, английском, французском и других "западных" языках.
    знаки препинания punctuation marks Знаки, используемые в пунктуации, для разделения предложений и их частей. Кроме "обычных" знаков ",", ".", и других к ним относятся кавычки, апострофы, английские сокращения "" и "@", а также знак подчеркивания и некоторые другие символы.
    пробельные символы spacing symbols (characters) Символы, используемые для разделения слов в предложениях. К ним относят, кроме пробела, знаки горизонтальной и вертикальной табуляции, "возврат каретки", "перенос строки", "прогон страницы", а также нулевой символ.
    специальные символы special characters Символы, не относящиеся к другим категориям и используемые для управления устройствами. См. метасимволы.
    сплошная нумерация continuous numeration Кодировка имеет сплошную нумерацию литер алфавита, если последовательность литер пронумерована "подряд", соседними числами без разрывов. Сплошную нумерацию символов латиницы имеют все кодировки, кроме EBCDIC. Сплошная нумерация кириллических символов реализована в кодировках ANSI cp 1251, USSR GOST, Unicode и некоторых других.
    алгоритм сравнения строк compare string algorithm Алгоритм, в котором строки сравниваются в лексикографическом порядке, и результат сравнения (больше, меньше, совпадают) передается оператору условия. Алгоритм сравнения строк используется для сортировки строк.
    сортировка строк sorting of the screen Расположение строк по возрастанию или по убыванию в лексикографическом порядке. В алгоритме сортировке используется алгоритмы сравнения строк.
    лексикографический порядок dictionary order Порядок слов по алфавиту, в том виде, в котором он представлен в ЭВМ. При этом среди слов, имеющих одинаковое начало, большим будет считаться то, которое содержит больше символов.
    семи битные кодировки seven bit codepages Кодировки, для представления символов в которых используется семь младших бит байта (из восьми). При этом старший бит используется для проверки правильности передачи символов.
    кириллические символы Cyrillic character Литеры русского алфавита и алфавитов некоторых других славянских народов, созданные просветителями Кириллом и Мефодием при переводе библии с греческого на славянские языки. Кириллические символы входят в алфавиты всех народов России. В компьютере эти символы кодируются восьми битными кодировками и разновидностями Unicode.
    ASCII ("аски") код ASCII 7-ми битный код для представления основных знаков препинания, цифр и букв латинского алфавита. Имеет "сплошную" нумерацию букв латинского алфавита. В настоящее время является основой для других кодировок.
    UNIX ("ЮНИКС") UNIX Операционная система персональных компьютеров и мощных ЭВМ, разработанная в корпорации ATT в 1972 г. Первоначально весь Интернет был доступен только для машин, работающих под операционной системой UNIX. В СССР эта операционная систем была известна под именем: "Демос".
    VAX ("вакс") VAX Знаменитый компьютер корпорации Digital Equipment, породивший в 70-х - 80-х годах XX века множество своих "клонов" в виде СМ ЭВМ в СССР и странах СЭВ. Имел собственную операционную систему. В настоящее время его производство и техническая поддержка прекратились.
    MS-DOS (ДОС) MS-DOS Операционная система персональных компьютеров 80-х - 90-х годов XX века, основанных на процессорах Intel.
    Linux ("Линукс") Linux Одна из реализаций операционной системы UNIX, использующей открытый код и открытое программное обеспечение. Ее "ядро" разработано в начале 90-х годов XX века Линусом Торвальдсом (Финляндия).
    кириллическая кодировка Cyrillic codepage Кодировка, содержащая кириллические символы. К кириллическим кодировкам относят: OEM 866, ANSI cp 1251, USSR GOST, KOI8-R, Unicode, UTF-8 и др.
    OEM 866 OEM 866 Кириллическая кодировка MS-DOS. По-другому называется: "альтернативная русская кодировка".
    ANSI cp 1251 ANSI cp 1251 Кириллическая кодировка MS Windows, основанная на кодировке ASCII и имеющая длину 8 бит. Имеют сплошную нумерацию для латинских литер и частично сплошную - для литер русского алфавита.
    кодировка ГОСТ СССР USSR GOST 8-ми битная кодировка со сплошной нумерацией кириллических символов. Большого распространения не получила.
    транскрипция 1. transcription 1. Запись кириллических символов вместо латинских букв или наоборот, учитывая их произношение. Например, латинской "P" соответствует буква "П", "C" - "Ц", "S" - "С", "V" - "В" и т.д. Транскрипция использовалась при создании кодировок KOI8-R (KOI8-U), и при составлении раскладки английских литер на "русской" клавиатуре.
    КОИ-8 KOI8-R 8-ми битная кириллическая кодировка, используемая в UNIX и ее клонах. В настоящее время является устаревшей. В этой кодировке латинские символы с номерами 128 - 255 были заменены на кириллические символы в той же транскрипции. При этом кириллические символы упорядочены не по алфавиту: вот первые из семи последовательных кириллических символов в этой кодировке: "Ю, А, Б, Ц, Д, Е, Ф, …".
    юникод Unicode Кодировка длиной 2 байта для представления всех символов всех национальных алфавитов. Имеет в два раза больший объем, чем основанные на ASCII кодировках. В настоящее время является стандартом для кодирования символов национальных алфавитов.
    UTF-8 UTF-8 Кодировка переменной длины, хранящая символы латиницы в кодировке ASCII, а все символы национальных алфавитов - в юникоде. Часто позволяет более "компактно" представлять текст. В настоящее время является стандартом для кодирования символов в операционных системах.
    символы псевдографики pseudo graphics character Символы в восьми битных кодировках OEM, предназначенные для рисования линий таблиц, "заполнений" и стрелок. Эти символы находятся в кодовой таблице под номерами с 176 по 223, и используются только в MS-DOS и совместимых с нею операционных системах.
    знакогенератор characters' decoder Интегральная схема в мониторе, способная в текстовом режиме его работы преобразовывать символы из кодовых страниц OEM (MS-DOS) в видимые литеры на экране дисплея. В графическом режиме работы дисплея знакогенератор не задействован.
    многоразрядные кодировки multidigit codepages К многоразрядным кодировкам относят кодировки UTF-8, Unicode и другие, имеющие переменное число разрядов или число разрядов, большее восьми. Многоразрядные кодировки помогают кодировать символы всех существующих национальных алфавитов.
    символьный тип данных symbol (character) data type Целый тип данных, используемый для хранения в нем символов в одной из кодировок. Различают примитивные символьные данные и специальные символьные типы данных. Они отличаются в "машинной" реализацией типов в языках программирования.
    примитивный символьный тип данных primitive character data type Символьный тип данных, реализованный в виде целочисленной ячейки памяти для хранения одного символа. Для хранения строки символов будет использован массив этих данных. Обычно этот тип данных обозначается как 'char'.
    строка string Последовательность символов в одной из кодировок, оканчивающаяся терминальным символом. Обычно строка представляется в виде массива примитивных типов данных. Ориентировочно максимальная длина строки лежит в пределах: ~ 255 - 2047 символов.
    терминальный символ строки terminal character of a string Символ, указывающий на окончание строки символов. Все символы, расположенные после терминального символа, игнорируются. В Си-подобных языках терминальный символ - ноль ('\0', или '0x00').
    максимальный индекс строки maximal string index Заданные программистом или компьютерными системами ограничения на количество символов в строке для примитивных символьных данных. Изменяется от 255 (Бейсик) до 64K (Си), но на практике не советуется устанавливать его большим 2000 символов.
    максимальная длина массива ultimate array length Общее количество элементов в массиве. Это значение является максимально возможным значением индекса массива. Длина массива может быть постоянной (фиксированной для статичного массива), а может увеличиваться и уменьшаться (для так называемых динамических массивов, не рассматривающихся в данных лекциях).
    фиксирование 1. fixation Явное указание числа элементов у статичного массива при его объявлении, которое также задает максимальное значение его индекса. Это число указывается либо целой константой, либо именованной макроподстановкой (на языке Си).
    статичный массив static array Массив с постоянным числом его элементов, который объявляется вначале блока операторов и под которое в программе выделяется место в оперативной памяти в виде "сплошной" последовательности ячеек. В отличие от динамических массивов максимальное число его элементов не изменяется.
    нулевая константа zero constant Символ с кодом ASCII 0 (0x00), имеющий в Си-подобных языках обозначение '\0'. Именно этим символом заканчивается любая строка примитивных символьных данных.
    создание (массива) allocating (of an array) Выделение места в оперативной памяти для размещения элементов массива, и присвоение указателю на этот массив адреса этой ячейки памяти на время выполнения программы (run-time). После завершения работы с массивом выделенную под него область памяти необходимо освободить перед завершением работы программы.
    объявление (массива) declaration (of an array) Выделение места в оперативной памяти для размещения элементов массива и, возможно, его инициализации в процессе компиляции программы. "Объявленную" память освобождать не нужно.
    инициализация (массива) initialization (of an array) Присвоение конкретных значений элементам массива при его объявлении или сразу после его создания. Обычно символьный массив инициализируется нулевыми символами специальными функциями.
    нулевой символ zero character См. нулевая константа.
    освобождение памяти release of a memory Отмена выделения места в оперативной памяти места для элементов массива и присвоение связанному с ним указателю значения "NULL". После освобождения памяти при попытке обратиться к элементу массива возникает ошибка "отказ в доступе" (access denied).
    копия изменяемой строки copy of changed string Точная копия элементов изменяемого массива, сделанная с него для манипуляции данными. Ее делают для реализации "джентльменского соглашения", согласно которому исходные символьные данные не меняются при манипуляциях со строками.
    Страницы:

    6.1 Кодировки

    6.1.1. Представление символов целыми числами

    Как уже указывалось в лекции 5, все символы в ЭВМ представлены в виде целых чисел. Порядок соответствия литер символов целым числам называется кодировкой (или кодовой таблицей, таблицей символов). В зависимости от размера таблицы символов разрядность этих целых чисел равна 1 байт (для кодировок EBCDIC и всех вариантов ASCII) , 2 байта (для кодировок Unicode) или переменной длины (UTF-8, UTF-7 и др.). Более подробно о кодировках будет сказано ниже.

    6.1.2. Кодировки

    Вначале возникли кодировки, включающие в себя десятичные цифры, буквы (прописные и строчные) латинского алфавита, сокращения английского языка (такие как "" и "@"), знаки препинания и специальные символы. На основе этих символов возникли кодировки EBCDIC (более старая) и ASCII (более новая, используемая до сих пор). Преимущества кодировки ASCII в том, что расположение латинских букв в ней не только упорядочено по алфавиту (как это сделано во всех кодировках), но и расположены эти буквы "без разрывов", то есть присутствует сплошная нумерация букв от A до Z и от a до z. Это позволяет лучше реализовать алгоритмы сравнения символов и сортировку строк символов.

    Замечание. Из-за особенностей русского алфавита, реализовать кодирование букв подряд не удается ни в одной из кодировок. Дело в том, что кириллическая буква "е" есть только в русском алфавите, но не входит в состав "стандартных" кириллических символов. Наиболее "правильно" русский алфавит представлен в кодировке ANSI cp 1251, USSR GOST и Unicode.

    Кодировки EBCDIC и ASCII являются 7-ми битными кодировками, хотя они и занимают 1 байт. Самый старший (нулевой) бит является либо резервным, либо используется для контроля четности при передаче данных.

    6.1.3. Восьмибитные кодировки

    Однако в кодировке ASCII отсутствуют даже некоторые символы (умляуты) западноевропейских алфавитов. Что же говорить о кириллических символах... Для решения этой проблемы были созданы расширенные кодировки ASCII, в которых для представления символов используются все восемь бит. Это доводит количество закодированных символов до 256. Среди реализаций кириллических символов в расширенных ASCII кодировках можно отметить кодировки OEM 866 (MS-DOS), ANSI cp 1251 (Windows) и KOI8-R (все клоны UNIX и VAX).

    Относительно полно концепция "сплошной нумерации" применяется в кодировке USSR GOST и ANSI cp 1251. Кодировка USSR GOST должна была заменить кодировку OEM 866 на компьютерах, производимых в СССР. Однако, по ряду причин, этого не произошло, и в настоящее время эта кодировка является "мертвой".

    Исторически первой кодировкой с кириллическими символами была кодировка KOI8. В ней латинские буквы с кодами 128-255 были заменены кириллическими символами в той же транскрипции. К сожалению, эта кодировка сейчас почти сошла на "нет" по следующим причинам:

  • Этот стандарт не поддержали производители компьютерного оборудования за рубежом;
  • Отсутствие "сплошной" нумерации кириллического алфавита;
  • Невозможность совместного использования кириллицы и умляутов;
  • "Неправильная" реализация символов псевдографики.
  • Следом за этой кодировкой на российские компьютеры вначале пришла болгарская, а затем - и альтернативная русская кодировка ДОС, впоследствии переименованная в OEM 866. Преимущества этой кодировки:

  • Компактность;
  • Частично сплошная нумерация символов;
  • Полная совместимость с MS-DOS;
  • Корректная реализация символов псевдографики;
  • "Нормальная" обработка символов на всех платформах;
  • Наличие коммерческих и некоммерческих знакогенераторов для этой платформы.
  • Недостатками этой кодировки являются:

  • Привязанность к MS-DOS, вместе с которой эта кодировка "умирает";
  • Невозможность совместного использования кириллицы и умляутов;
  • Общий недостаток всех восьмибитных кодировок - ограничение на кодирование только 256-ю символами.
  • Кодировка ANSI cp 1251 получила широкое распространение из-за продвижения продукции корпорации Microsoft, прежде всего Microsoft Windows и Microsoft Word, на Российский рынок. Эта кодировка имеет большие преимущества перед другими кириллическими кодировками:

  • Компактность;
  • Сплошная нумерация символов (кроме "е" и "Ё");
  • Стандартность.
  • Однако у этой кодировки есть недостатки:

  • Привязанность в основном к платформе Microsoft Windows;
  • Некорректная обработка многими программами символов с номерами 254 и 255 ("ю" и "я");
  • Невозможность совместного использования кириллицы и умляутов.
  • 6.1.4.Многоразрядные кодировки

    К "многоразрядным" кодировкам относятся кодировки Unicode и UTF. Рассмотрим историю их возникновения.

    Уже в начале 90-х годов XX века стало ясно, что 256 чисел для кодирования символов очень мало. Например, с помощью этих чисел нельзя кодировать все символы европейских алфавитов. Поэтому появились русские, западноевропейские, восточноевропейские, балтийские, не говоря уже об арабских, турецких кодировках и кодировках на иврите, каждая из которых содержала 256 символов. Что же говорить о вьетнамском алфавите, корейских, японских и китайских иероглифах, каждые из которых содержат более 256 символов? Для этой цели был разработан специальный стандарт на кодировку символов 16-ти разрядными целыми числами (2 байта) - Unicode. Полностью с помощью 16-ти разрядных чисел можно представить более 65 тысяч символов, что с избытком хватит для кодирования всех литер основных языков земли.

    При всей полезности кодировки символов Unicode следует отметить ее недостаток - вдвое больший размер кода, чем при использовании 8-ми разрядных кодировок. Этот недостаток особенно заметен при использовании только латинских букв. Поэтому вскоре был принят стандарт на кодировку UTF. В ней символы кодируются числом переменной разрядности: 7-ми разрядными кодами ASCII для латинских букв и 16-ти разрядными символами Unicode для всех остальных литер алфавита. За эту "экономию" приходится расплачиваться людям, пишущих на отличном от английского языка - работа с символами в кодировке UTF более сложная, чем в других кодировках. Это надо помнить!

    Примечание. Кодировка UTF-8 стала стандартом в операционной системе Linux и в Интернете. При разработке приложений в Microsoft Window, начиная с версии 98, также широко используются кодировки UTF-8 и UTF-7.

    6.2. Примитивные символьные данные

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

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

    Символьные типы данных
    Тип данных Префикс/Окончание Разрядность регистров/длина Примечание
    Quick Basic
    STR <идентификатор>$ Переменная длина (до 255 символов) Для хранения 1 символа в кодировке ASCII. Не защищен от изменений.
    VB Script
    Variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    Java
    char с 2 байта Для хранения одного символа в кодировке Unicode
    String str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    javascript
    variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    C/C++
    char с 1 байт Для хранения одного символа в кодировке ASCII (со знаком)
    unsigned char uc 1 байт Для хранения одного символа в кодировке ASCII (без знака)
    char * pc от 2 до 4 байт Указатель на массив (переменной длины)
    unsigned char * puc от 2 до 4 байт Указатель на массив (переменной длины)
    C/C++ Windows API
    BYTE b 1 байт Эквивалентен unsigned char
    NPSTR npsz 2 байта Эквивалентен char near *
    LPSTR lpch 4 байта Эквивалентен char far *
    LPCSTR lpsz 4 байта Эквивалентен const char far *
    C++ MFC
    CString cstr, str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    C++ Classlib
    string str Переменная длина Класс для хранения символов в кодировке ASCII (и Unicode?). Защищено от изменений!

    Обычно, в начале работы программы, весь массив символьных данных заполняют нулевой константой (она обозначается на языке Си как " \0 "). Это делается в расчете на то, что признаком конца символьных данных является не признак конца строки, не пробельный символ, а именно этот нулевой символ. Поэтому заполнение массива нулевыми символами заведомо гарантирует, что не случится ошибка типа размещения символьных данных за границами массива, после одиночного нулевого символа.

    Что касается максимальной длины символьной строки, то она может принимать значения от 255 (языки "Паскаль", "Quick Basic", СУБД dBase III+), 2047 (Multi Edit и часть редакторов) и даже ~ 64 Кбайт (величина сегмента памяти процессора x86). Но, следующий нехитрый расчет показывает, что использовать длину строки более 2000 (80*25) символов нерационально (она все равно не уместится на экране).

    Также автор советует не доверять своей памяти в использовании максимальной длины строки, а определить ее в виде константы целого значения (например, константного типа const unsigned short на языке Си).

    Следующим "джентльменским соглашением" при работе с символьными данными является неизменность значений массивов символьных данных (кроме, возможно, первого массива в выражении) при символьных вычислениях. Вот почему большинство символьных функций принимает тип аргументов как const char * (указатель на начало массива символьных констант). Именно к этому типу необходимо принудительно приводить Ваши переменные в программе!

    Итак, организация работы с "примитивными" символьными массивами данных следующая:

  • Создается (функцией malloc ) или объявляется (в начале блока программ) необходимое количество символьных массивов-переменных;
  • Они инициализируются нулевыми символами (функцией memset );
  • Производятся операции с символьными данными:
  • ввод;
  • присвоение им константных значений;
  • замена, добавление или "обрезание" значений этих переменных;
  • вывод символьных значений;
  • Для созданных переменных при завершении программы необходимо освободить память, размещенную при их создании (функцией free ).
  • Замечание: некоторые функции и операторы для работы с символьными данными (такие как MID$ в Quick Basic-е или Replace в некоторых библиотеках C/C++) могут изменять значения внутри массива символьных данных. Для соблюдения "джентльменского соглашения", необходимо сначала сделать копию изменяемой строки в виде отдельного массива, а уже в ней - изменять содержимое массива. Этот метод и безопаснее (в том числе и для противодействия хакерским атакам), и экономнее (память из-под ненужных символьных переменных можно сразу освободить). Замечание. Необходимо всегда следить, чтобы индекс символьной переменной-массива не выходил за границы массива. Обычно при этом генерируется ошибка операционной системы, которая может быть перехвачена хакером, открывающая таким образом доступ к Вашей операционной системе и Вашему компьютеру. Чтобы этого не произошло, автор советует ограничить использование функций mem*** и полностью исключить использование функций str*** (за исключением функции strlen ), заменив их функциями: strn*** (на языке Си). Звездочками обозначено окончание функций.

    Собственно стандартные функции для работы с символьными типами данных (в том числе и с примитивными данными) на языках Си и C++, вместе с комментариями, приведены в таблице 6.2.

    Функции для работы с текстом
    Функция/Метод Описание Пример
    Язык Си. Функции ANSI C
    #include <string.h> Заголовочный файл для этих функций
    int strlen( char *str ); Возвращает длину строки str1 (позицию его символа \0).
    char* strerror( char *str );
    char *strncat( char *str1, char *str2, unsigned int n ); Конкатенация строки str1 и str2, но в строку n записывается не более n символов. Возвращается значение строки str1 или NULL при неудаче конкатенации.
    int strncmp( char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2.
    char *strncpy( char *str1, char *str2, unsigned int n ); Копирует строку str2 в строку str1, но не более чем n символов. Возвращается значение строки str1 или NULL при неудаче копирования.
    char *strpbrk( char *str1, char *str2 ); Ищется первое вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strrchr( char *str1, char *str2 ); Ищется последнее вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strspn( char *str1, char *str2 ); Ищется первое вхождение символа, которого нет в строке str2, в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strstr( char *str1, char *str2 ); Ищется первое вхождение подстроки str2 в строке str1. Возвращается указатель на заданную подстроку или NULL в случае ее необнаружения.
    char *strtok( char *str1; char *str2 ); Функция разбивает строку str1 на слова, вставляя после каждого из них символ '\0'. Символы, являющиеся разделителями слов, перечислены в строке str2. При первом вызове функция возвращает указатель на str1. При последующем вызове (с параметром str1 == NULL) она возвращает указатели на другие слова в строке str1. Функция возвращает NULL, если все слова закончились.
    char *memchr( char *buf, char sim, unsigned cnt ); Функция ведет поиск первого вхождения символа sim в не более чем cnt символов с начала строки buf. Возвращает указатель на символ sim в случае его нахождения или NULL если он не найден.
    int memcmp( char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memcpy( char *dst1, char *src2, unsigned int n ); Копирует строку src2 в строку dst1, но не более чем n символов. Возвращается значение строки dst1. Реализация функции гарантирует, что перекрывающие участки будут правильно обработаны.
    Функции TURBO C и MSC (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    int memicmp(char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Регистр символов игнорируется. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memmove(char *buf1, char *buf2, unsigned cnt ); Функция полностью идентична функции memcpy. При копировании перекрывающихся участков гарантируется, что эти участки скопируются правильно.
    char *memset( char *dest, char sim, unsigned cnt ); Функция присваивает буферу dest повторяющиеся cnt число раз значения символа sim. Возвращаемое значение - указатель на массив dest. Примечание: с помощью этой функции можно задать строку, содержащую в себе только пустые символы: '\0'. Этого невозможно сделать с помощью команды strnset.
    char *strnset( char *str1, char sim, unsigned int n ); Функция присваивает буферу str1 повторяющиеся не более чем n число раз значения символа sim. Возвращаемое значение - указатель на массив str1.
    int strnicmp(char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2. Регистр символов игнорируется.
    char *strlwr( char *str ); Переводит все символы в строке str в нижний регистр. Возвращает значение указателя на строку str.
    char *strrev( char *str ); Функция меняет порядок следования символов в строке str. Возвращает значение указателя на строку str.
    char *strupr( char *str ); Переводит все символы в строке str в верхний регистр. Возвращает значение указателя на строку str.
    Функции TURBO C (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    char *strerror( int number );
    Язык Си. Функции ANSI C
    #include <stdio.h> Заголовочный файл для этих функций
    int sprintf( char *buffer, char *format_string[, arguments]); Функция форматирует и записывает в строку buffer сформированную строку символов, задаваемой шаблоном-строкой format_string. Обозначение метасимволов в шаблоне аналогично программе printf.

    В таблице 6.3 приведены функции работы со скалярами и массивами скаляров на языке Perl.

    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Perl Функции для работы со скалярами
    chomp chomp СПИСОК Удаляет из каждого строкового элемента замыкающий символ завершения записи, определенного значением переменной $/ (по умолчанию - \n). Возвращает общее количество удаленных символов. Список может состоять из одной переменной. При использовании без параметра функция эквивалентна chomp $_ .
    chop chop СПИСОК Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение - удаленный символ из последнего элемента списка. Список может состоять из одной переменной. При использовании без параметров эквивалентно вызову chop $_ .
    chr chr ЧИСЛО Возвращает символ по заданному числовому коду таблицы символов. При использовании без параметров эквивалентно вызову chr $_ .
    crypt crypt ТЕКСТ, ШИФР Шифрует ТЕКСТ с использованием заданного параметра шифра. Обратной функции дешифровки не существует.
    hex hex ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатеричное число и вычисляет его десятичный эквивалент. При использовании без параметров вызов аналогичен вызову hex $_ .
    index index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию первого вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается с заданной позиции в строке (нумерация символов в строке начинается с "0").
    lc lc ВЫРАЖЕНИЕ, Функция преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров функция аналогична вызову lc $_ .
    lcfirst lcfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову lcfirst $_ .
    length length ВЫРАЖЕНИЕ Возвращает количество байтов в строке, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров функция эквивалентна вызову length $_ .
    oct oct ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов 0x, то его содержимое интерпретируется как шестнадцатеричное число. При использовании без параметров вызов функции аналогичен вызову oct $_ .
    ord ord ВЫРАЖЕНИЕ Возвращает числовой ASCII код первого символа строки, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров вызов функции аналогичен вызову ord $_ .
    pack pack ШАБЛОН, СПИСОК Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру.
    reverse reverse СПИСОК В списковом контексте возвращает список значений, состоящий из элементов, заданным параметром СПИСОК списка, но в обратном порядке, начиная с последнего символа. В скалярном контексте соединяет все элементы списка в одну строку, состоящую из символов полученной строки, но в обратном порядке.
    rindex rindex СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию последнего вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается до заданной позиции в строке (включая символ в этой позиции).
    sprintf sprintf ФОРМАТ, СПИСОК Возвращает строку, представляющую собой форматный вывод списка значений, определенного параметром СПИСОК, в соответствии с заданной параметром ФОРМАТ строкой формата. Символы форматирования соответствуют функции форматирования языка Си printf.
    substr substr СТРОКА, СМЕЩЕНИЕ[, ДЛИНА[, ЗАМЕЩЕНИЕ]] Находит и возвращает из параметра СТРОКА, подстроку длиной, равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если значение СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение ДЛИНА отрицательно, то от конца строки отсекаются количество символов, равное абсолютному значению этого параметра. Если задан строковый параметр ЗАМЕЩЕНИЕ, то найденная подстрока замещается ею в параметре СТРОКА, который в этом случае должен быть l-Значением.
    uc uc ВЫРАЖЕНИЕ, Функция преобразует все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову uc $_ .
    ucfirst ucfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову ucfirst $_ .
    Лексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение.
    Perl Функции для работы со скалярами (поиск и замена фрагментов)
    pos pos СТРОКА pos Возвращает значение указателя позиции в строке после последней выполненной для нее операции поиска по образцу: m//g. Если используется в левой части операции присвоения, то изменяет значение указателя, влияя на \G в регулярном выражении. При использовании без параметров данный вызов эквивалентен вызову: pos $_.
    quotemeta quotemeta ВЫРАЖЕНИЕ quotemeta Возвращает строку, в которой перед каждым неалфавитно-цифровым символом поставлена обратная черта. Значение параметра: ВЫРАЖЕНИЕ - интерпретируется как строка. (Внутренняя функция реализации управляющего символа \0 в строках в двойных кавычках). При использовании функции без параметров эквивалентно вызову quotemeta $_.
    split split /ОБРАЗЕЦ/[.ВЫРАЖЕНИЕ[.ПРЕДЕЛ]] split Разбивает строку, являющуюся значением параметра: ВЫРАЖЕНИЕ, на массив строк, с использованием разделителя, определяемым регулярным выражением в параметре: ОБРАЗЕЦ. В списковом контексте возвращает полученный массив, в скалярном контексте - количество найденных строк разбиения. Если задан параметр: ПРЕДЕЛ, разбивает на не более чем заданное этим параметром число строк. Если параметр: ВЫРАЖЕНИЕ - не задан, то используется внутренняя специальная переменная интерпретатора Perl $_, Если не задан образец, то разбивает по пробельным символам. При использовании без параметра эквивалентна split /\s+/. $_. Операция split - антагонист операции: join.
    study study ВЫРАЖЕНИЕ study Оптимизирует строковые данные параметра: ВЫРАЖЕНИЕ - для дальнейшего использования в повторных операциях поиска по образцу. В цикле с несколькими операциями поиска может сэкономить время выполнения. При использовании без параметров функция эквивалентна: study $_.
    Perl Функции для работы с массивами скаляров
    delete delete ВЫРАЖЕНИЕ Удаляет из массива скаляров его элемент или фрагмент, заданный параметром: ВЫРАЖЕНИЕ. Если удаляется последний элемент массива, то автоматически изменяется длина массива, если удаляются элементы из его середины, то оставшиеся элементы не сдвигаются (для сдвига используйте функцию splice()), а соответствующий "удаленный" элемент принимает неопределенное значение. В списковом контексте возвращает список удаленных элементов, а в скалярном - их количество. Если удаляемых символов в массиве нет, то возвращает неопределенное значение. Функция delete работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    exists exists ВЫРАЖЕНИЕ Проверяет, был ли когда-либо инициализирован в массиве скаляров элемент, заданный параметром: ВЫРАЖЕНИЕ, например, $array[3], даже если сейчас его значение не определено. Если да, то возвращает значение "истина", иначе - "ложь". Функция exist работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    pop pop МАССИВ pop Удаляет из массива скаляров последний элемент и возвращает его значение. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен pop @ARGV, а в подпрограмме pop @_.
    push push МАССИВ, СПИСОК Рассматривает массив скаляров, заданный параметром: МАССИВ, как стек и добавляет после его последнего элемента элементы списка, заданные параметром: СПИСОК. Возвращает количество элементов полученного массива.
    shift shift МАССИВ shift Удаляет из массива скаляров первый элемент и возвращает его значение. После удаления элементы оставшиеся элементы сдвигаются влево: второй элемент становится первым, третий - вторым и т.д. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен shift @ARGV, а в подпрограмме shift @_.
    splice splice МАССИВ, НОМЕР[, КОЛИЧЕСТВО[, СПИСОК]] Удаляет из массива количество элементов, заданное значением параметра: КОЛИЧЕСТВО, начиная с элемента, заданное значением параметра: НОМЕР. В случае задания параметра СПИСОК заменяет указанные в нем элементы списка. В списковом контексте возвращает удаленные элементы; в скалярном контексте - последний удаленный элемент. Если параметр:КОЛИЧЕСТВО не задан, то удаляются все элементы после элемента с номером, определенным значением параметра: НОМЕР.
    unshift unshift МАССИВ, СПИСОК Добавляет элементы списка, определенного параметром: СПИСОК, в начало массива, заданного параметром МАССИВ. Выполняет действия, противоположные действиям функции shift.
    grep grep БЛОК СПИСОК grep ВЫРАЖЕНИЕ, СПИСОК
    join join ВЫРАЖЕНИЕ, СПИСОК Рассматривает все элементы списка, определенного параметром: СПИСОК, как строковые значения, соединяет их в одну строку, вставляя между ними разделитель, равный значению параметра: ВЫРАЖЕНИЕ, и возвращает полученную строку.
    map map БЛОК СПИСОК map ВЫРАЖЕНИЕ, СПИСОК
    pack pack ВЫРАЖЕНИЕ, СПИСОК
    reverse reverse СПИСОК В списковом контексте возвращает список значений элементов, заданный параметром: СПИСОК, в обратном порядке, начиная с последнего элемента. В скалярном контексте соединяет все элементы в одну строку и возвращает строку, в которой символы расположены в обратном порядке, начиная с последнего символа.
    sort sort [ПОДПРОГРАММА] СПИСОК sort [БЛОК] СПИСОК Сортирует список значений, заданный в параметре: СПИСОК. Если параметры БЛОК и ПОДПРОГРАММА не заданы, то используется стандартная процедура сравнения строковых данных. Если они заданы, то операторы блока или подпрограммы используются в качестве процедуры сравнения при сортировке элементов списка. В этом случае в теле блока или подпрограммы в последнем операторе следует использовать операцию <=> или cmp в зависимости от сортировки соответственно числовых и строковых данных. Возвращает список, элементами которого являются отсортированные элементы исходного списка.
    unpack unpack ШАБЛОН, ВЫРАЖЕНИЕ

    [Пример 01]

    Примеры выражений

    Пусть нам надо вставить во фразу: "Привет, <имярек>! С добрым утром." - вместо <имярек> человеческое имя, например, Света. Приводятся примеры фрагментов программ, написанных на языках Си, Perl и Quick Basic:

    Си:

    /* Определение констант и переменных */
    const unsigned short maxstringlength = 255;
    char strSveta[] = "Света";
    char strResult[maxstringlength];
    /* Заполнение результирующей переменной нулями*/
    memset( strResult, '\0', (size_t) maxstringlength);
    /* Символьные вычисления */
    strncpy( strResult, "Привет ", maxstringlength );
    strncat( strResult, (const char *)strSveta, maxstringlength );
    strncat( strResult, "! С добрым утром.", maxstringlength );

    Perl:

    # Определение переменной: <имярек>.
    $ImyaRek = 'Света';
    
    # Определение результирующей строки.
    $strResult = "Привет, $ImyaRek! С добрым утром.";

    Quick Basic:

    REM Определение переменной: <имярек>.
    ImyaRek$ = "Света"
    REM Символьные вычисления.
    strResult$ = "Привет " + ImyaRek$ + "! С добрым утром."

    6.3. Резюме

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

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

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

    6.4. Глоссарий

    Термин Английский термин Разъяснение
    кодовая таблица code table 1. См. кодировка.
    таблица символов code table 1. См. кодировка.
    кодировка codepage Порядок соответствия литер символов целым числам.
    длина кодировки codepage length Разрядность целого числа, используемого для представления литер. Используются однобайтные, двухбайтные кодировки и кодировки переменной длины.
    EBCDIC-код EBCDIC Кодировка латинских символов, десятичных цифр, знаков препинания, пробельных и специальных символов на основе 7-ми битного кода. Не имеет сплошной кодировки символов. Данная кодировка применялась в мэйнфреймах IBM-360/370 и советских ЭВМ серии ЕС. В настоящее время безнадежно устарела.
    десятичные цифры decimal digits Цифры, применяемые в десятичной системе счисления. Содержат в себе литеры от 0 до 9.
    латинский алфавит Latin alphabet Прописные и строчные буквы от A до Z (всего 52 символа). Латинский алфавит используется в латинском, английском, французском и других "западных" языках.
    знаки препинания punctuation marks Знаки, используемые в пунктуации, для разделения предложений и их частей. Кроме "обычных" знаков ",", ".", и других к ним относятся кавычки, апострофы, английские сокращения "" и "@", а также знак подчеркивания и некоторые другие символы.
    пробельные символы spacing symbols (characters) Символы, используемые для разделения слов в предложениях. К ним относят, кроме пробела, знаки горизонтальной и вертикальной табуляции, "возврат каретки", "перенос строки", "прогон страницы", а также нулевой символ.
    специальные символы special characters Символы, не относящиеся к другим категориям и используемые для управления устройствами. См. метасимволы.
    сплошная нумерация continuous numeration Кодировка имеет сплошную нумерацию литер алфавита, если последовательность литер пронумерована "подряд", соседними числами без разрывов. Сплошную нумерацию символов латиницы имеют все кодировки, кроме EBCDIC. Сплошная нумерация кириллических символов реализована в кодировках ANSI cp 1251, USSR GOST, Unicode и некоторых других.
    алгоритм сравнения строк compare string algorithm Алгоритм, в котором строки сравниваются в лексикографическом порядке, и результат сравнения (больше, меньше, совпадают) передается оператору условия. Алгоритм сравнения строк используется для сортировки строк.
    сортировка строк sorting of the screen Расположение строк по возрастанию или по убыванию в лексикографическом порядке. В алгоритме сортировке используется алгоритмы сравнения строк.
    лексикографический порядок dictionary order Порядок слов по алфавиту, в том виде, в котором он представлен в ЭВМ. При этом среди слов, имеющих одинаковое начало, большим будет считаться то, которое содержит больше символов.
    семи битные кодировки seven bit codepages Кодировки, для представления символов в которых используется семь младших бит байта (из восьми). При этом старший бит используется для проверки правильности передачи символов.
    кириллические символы Cyrillic character Литеры русского алфавита и алфавитов некоторых других славянских народов, созданные просветителями Кириллом и Мефодием при переводе библии с греческого на славянские языки. Кириллические символы входят в алфавиты всех народов России. В компьютере эти символы кодируются восьми битными кодировками и разновидностями Unicode.
    ASCII ("аски") код ASCII 7-ми битный код для представления основных знаков препинания, цифр и букв латинского алфавита. Имеет "сплошную" нумерацию букв латинского алфавита. В настоящее время является основой для других кодировок.
    UNIX ("ЮНИКС") UNIX Операционная система персональных компьютеров и мощных ЭВМ, разработанная в корпорации ATT в 1972 г. Первоначально весь Интернет был доступен только для машин, работающих под операционной системой UNIX. В СССР эта операционная систем была известна под именем: "Демос".
    VAX ("вакс") VAX Знаменитый компьютер корпорации Digital Equipment, породивший в 70-х - 80-х годах XX века множество своих "клонов" в виде СМ ЭВМ в СССР и странах СЭВ. Имел собственную операционную систему. В настоящее время его производство и техническая поддержка прекратились.
    MS-DOS (ДОС) MS-DOS Операционная система персональных компьютеров 80-х - 90-х годов XX века, основанных на процессорах Intel.
    Linux ("Линукс") Linux Одна из реализаций операционной системы UNIX, использующей открытый код и открытое программное обеспечение. Ее "ядро" разработано в начале 90-х годов XX века Линусом Торвальдсом (Финляндия).
    кириллическая кодировка Cyrillic codepage Кодировка, содержащая кириллические символы. К кириллическим кодировкам относят: OEM 866, ANSI cp 1251, USSR GOST, KOI8-R, Unicode, UTF-8 и др.
    OEM 866 OEM 866 Кириллическая кодировка MS-DOS. По-другому называется: "альтернативная русская кодировка".
    ANSI cp 1251 ANSI cp 1251 Кириллическая кодировка MS Windows, основанная на кодировке ASCII и имеющая длину 8 бит. Имеют сплошную нумерацию для латинских литер и частично сплошную - для литер русского алфавита.
    кодировка ГОСТ СССР USSR GOST 8-ми битная кодировка со сплошной нумерацией кириллических символов. Большого распространения не получила.
    транскрипция 1. transcription 1. Запись кириллических символов вместо латинских букв или наоборот, учитывая их произношение. Например, латинской "P" соответствует буква "П", "C" - "Ц", "S" - "С", "V" - "В" и т.д. Транскрипция использовалась при создании кодировок KOI8-R (KOI8-U), и при составлении раскладки английских литер на "русской" клавиатуре.
    КОИ-8 KOI8-R 8-ми битная кириллическая кодировка, используемая в UNIX и ее клонах. В настоящее время является устаревшей. В этой кодировке латинские символы с номерами 128 - 255 были заменены на кириллические символы в той же транскрипции. При этом кириллические символы упорядочены не по алфавиту: вот первые из семи последовательных кириллических символов в этой кодировке: "Ю, А, Б, Ц, Д, Е, Ф, …".
    юникод Unicode Кодировка длиной 2 байта для представления всех символов всех национальных алфавитов. Имеет в два раза больший объем, чем основанные на ASCII кодировках. В настоящее время является стандартом для кодирования символов национальных алфавитов.
    UTF-8 UTF-8 Кодировка переменной длины, хранящая символы латиницы в кодировке ASCII, а все символы национальных алфавитов - в юникоде. Часто позволяет более "компактно" представлять текст. В настоящее время является стандартом для кодирования символов в операционных системах.
    символы псевдографики pseudo graphics character Символы в восьми битных кодировках OEM, предназначенные для рисования линий таблиц, "заполнений" и стрелок. Эти символы находятся в кодовой таблице под номерами с 176 по 223, и используются только в MS-DOS и совместимых с нею операционных системах.
    знакогенератор characters' decoder Интегральная схема в мониторе, способная в текстовом режиме его работы преобразовывать символы из кодовых страниц OEM (MS-DOS) в видимые литеры на экране дисплея. В графическом режиме работы дисплея знакогенератор не задействован.
    многоразрядные кодировки multidigit codepages К многоразрядным кодировкам относят кодировки UTF-8, Unicode и другие, имеющие переменное число разрядов или число разрядов, большее восьми. Многоразрядные кодировки помогают кодировать символы всех существующих национальных алфавитов.
    символьный тип данных symbol (character) data type Целый тип данных, используемый для хранения в нем символов в одной из кодировок. Различают примитивные символьные данные и специальные символьные типы данных. Они отличаются в "машинной" реализацией типов в языках программирования.
    примитивный символьный тип данных primitive character data type Символьный тип данных, реализованный в виде целочисленной ячейки памяти для хранения одного символа. Для хранения строки символов будет использован массив этих данных. Обычно этот тип данных обозначается как 'char'.
    строка string Последовательность символов в одной из кодировок, оканчивающаяся терминальным символом. Обычно строка представляется в виде массива примитивных типов данных. Ориентировочно максимальная длина строки лежит в пределах: ~ 255 - 2047 символов.
    терминальный символ строки terminal character of a string Символ, указывающий на окончание строки символов. Все символы, расположенные после терминального символа, игнорируются. В Си-подобных языках терминальный символ - ноль ('\0', или '0x00').
    максимальный индекс строки maximal string index Заданные программистом или компьютерными системами ограничения на количество символов в строке для примитивных символьных данных. Изменяется от 255 (Бейсик) до 64K (Си), но на практике не советуется устанавливать его большим 2000 символов.
    максимальная длина массива ultimate array length Общее количество элементов в массиве. Это значение является максимально возможным значением индекса массива. Длина массива может быть постоянной (фиксированной для статичного массива), а может увеличиваться и уменьшаться (для так называемых динамических массивов, не рассматривающихся в данных лекциях).
    фиксирование 1. fixation Явное указание числа элементов у статичного массива при его объявлении, которое также задает максимальное значение его индекса. Это число указывается либо целой константой, либо именованной макроподстановкой (на языке Си).
    статичный массив static array Массив с постоянным числом его элементов, который объявляется вначале блока операторов и под которое в программе выделяется место в оперативной памяти в виде "сплошной" последовательности ячеек. В отличие от динамических массивов максимальное число его элементов не изменяется.
    нулевая константа zero constant Символ с кодом ASCII 0 (0x00), имеющий в Си-подобных языках обозначение '\0'. Именно этим символом заканчивается любая строка примитивных символьных данных.
    создание (массива) allocating (of an array) Выделение места в оперативной памяти для размещения элементов массива, и присвоение указателю на этот массив адреса этой ячейки памяти на время выполнения программы (run-time). После завершения работы с массивом выделенную под него область памяти необходимо освободить перед завершением работы программы.
    объявление (массива) declaration (of an array) Выделение места в оперативной памяти для размещения элементов массива и, возможно, его инициализации в процессе компиляции программы. "Объявленную" память освобождать не нужно.
    инициализация (массива) initialization (of an array) Присвоение конкретных значений элементам массива при его объявлении или сразу после его создания. Обычно символьный массив инициализируется нулевыми символами специальными функциями.
    нулевой символ zero character См. нулевая константа.
    освобождение памяти release of a memory Отмена выделения места в оперативной памяти места для элементов массива и присвоение связанному с ним указателю значения "NULL". После освобождения памяти при попытке обратиться к элементу массива возникает ошибка "отказ в доступе" (access denied).
    копия изменяемой строки copy of changed string Точная копия элементов изменяемого массива, сделанная с него для манипуляции данными. Ее делают для реализации "джентльменского соглашения", согласно которому исходные символьные данные не меняются при манипуляциях со строками.
    Вернуться к учебному плану