Сообщество Engee

Управляющие символы ASCII

Автор
avatar-maximsidorovmaximsidorov
Notebook

Фильтрация управляющих ASCII-символов

Краткая информация

Этот пример демонстрирует фильтрацию управляющих ASCII-символов из диапазона символов с помощью встроенной функции filter и предиката iscntrl.

Введение

Управляющие ASCII-символы (control characters) - это специальные символы в таблице ASCII с кодами от 0 до 31 и 127, которые не отображаются визуально, но выполняют специальные функции управления устройствами ввода-вывода, форматирования текста и передачи данных. Они используются для управления поведением терминалов, принтеров и других устройств. Например, символ \n (с кодом 10) используется для перевода строки, а символ \t (с кодом 9) - для табуляции. В программировании часто возникает необходимость определить, является ли символ управляющим, или отфильтровать такие символы из текста. В языке Julia для этого предусмотрены встроенные функции, среди которых iscntrl проверяет, является ли символ управляющим, а filter позволяет выбрать элементы коллекции, удовлетворяющие заданному условию.

Основная часть

Подготовка диапазона символов

Создаем диапазон всех ASCII-символов от 0 до 127

Char(0) - символ с кодом 0 (\0)

Char(127) - символ с кодом 127 (\x7f)

chars_range = Char(0):Char(127)
'\0':1:'\x7f'

Здесь мы создаем диапазон символов от символа с кодом 0 (нулевой символ, '\0') до символа с кодом 127 ('\x7f'), охватывая всю таблицу ASCII. Диапазон в языке Julia позволяет работать с последовательностями элементов, где каждый элемент следует за предыдущим с определенным шагом. В данном случае шаг по умолчанию равен 1, поэтому мы получаем все 128 ASCII-символов.

Фильтрация управляющих символов

Применяем фильтр для выбора только управляющих символов:

  • iscntrl - функция, проверяющая, является ли символ управляющим

  • filter применяет предикат к каждому элементу диапазона и возвращает массив только тех элементов, для которых предикат вернул true

control_chars = filter(iscntrl, chars_range)
33-element Vector{Char}:
 '\0': ASCII/Unicode U+0000 (category Cc: Other, control)
 '\x01': ASCII/Unicode U+0001 (category Cc: Other, control)
 '\x02': ASCII/Unicode U+0002 (category Cc: Other, control)
 '\x03': ASCII/Unicode U+0003 (category Cc: Other, control)
 '\x04': ASCII/Unicode U+0004 (category Cc: Other, control)
 '\x05': ASCII/Unicode U+0005 (category Cc: Other, control)
 '\x06': ASCII/Unicode U+0006 (category Cc: Other, control)
 '\a': ASCII/Unicode U+0007 (category Cc: Other, control)
 '\b': ASCII/Unicode U+0008 (category Cc: Other, control)
 '\t': ASCII/Unicode U+0009 (category Cc: Other, control)
 '\n': ASCII/Unicode U+000A (category Cc: Other, control)
 '\v': ASCII/Unicode U+000B (category Cc: Other, control)
 '\f': ASCII/Unicode U+000C (category Cc: Other, control)
 ⋮
 '\x15': ASCII/Unicode U+0015 (category Cc: Other, control)
 '\x16': ASCII/Unicode U+0016 (category Cc: Other, control)
 '\x17': ASCII/Unicode U+0017 (category Cc: Other, control)
 '\x18': ASCII/Unicode U+0018 (category Cc: Other, control)
 '\x19': ASCII/Unicode U+0019 (category Cc: Other, control)
 '\x1a': ASCII/Unicode U+001A (category Cc: Other, control)
 '\e': ASCII/Unicode U+001B (category Cc: Other, control)
 '\x1c': ASCII/Unicode U+001C (category Cc: Other, control)
 '\x1d': ASCII/Unicode U+001D (category Cc: Other, control)
 '\x1e': ASCII/Unicode U+001E (category Cc: Other, control)
 '\x1f': ASCII/Unicode U+001F (category Cc: Other, control)
 '\x7f': ASCII/Unicode U+007F (category Cc: Other, control)

Вызов filter(iscntrl, chars_range) фильтрует созданный диапазон и возвращает только те символы, которые являются управляющими. Функция iscntrl возвращает true, если символ принадлежит к категории "Cc: Other, control" в классификации Unicode. Результат записывается в переменную control_chars, которая будет содержать вектор из 33 элементов - всех управляющих ASCII-символов.

Анализ результата

Результат выполнения кода:

  • Получен вектор из 33 элементов
  • Все элементы являются управляющими символами ASCII
  • Символы с кодами 0-31 и 127 попали в результат
  • Некоторые символы отображаются специальными обозначениями (например, \n, \t, \r), а другие - шестнадцатеричными кодами (\x01, \x1f)

Заключение

В этом примере мы рассмотрели, как использовать встроенные функции языка Julia для фильтрации управляющих ASCII-символов. Мы создали диапазон всех символов ASCII, а затем применили функцию filter с предикатом iscntrl для выделения только управляющих символов. Эта техника полезна при обработке текста, когда нужно определить или удалить невидимые управляющие символы, которые могут оказывать влияние на форматирование или корректную работу программ. Понимание таких символов важно для разработчиков, работающих с текстовыми данными, парсерами, терминальным вводом-выводом или системным программированием.

Пример разработан с использованием материалов Rosetta Code