Что означает спецификация файла в виде строки asciiz
Обновлено: 20.08.2024
Содержание
Наложение символов
Благодаря символу BS (возврат на шаг) на принтере можно печатать один символ поверх другого. В ASCII было предусмотрено добавление таким образом диакритики к буквам, например:
- a BS ' → á
- a BS ` → à
- a BS ^ → â
- o BS / → ø
- c BS , → ç
- n BS
Примечание: в старых шрифтах апостроф ' рисовался с наклоном влево, а тильда
была сдвинута вверх, так что они как раз подходили на роль акута и тильды сверху.
Если на символ накладывается тот же символ, то получается эффект жирного шрифта, а если на символ накладывается подчёркивание, то получается подчёркнутый текст.
Примечание: это используется, например, в справочной системе man.
Национальные варианты ASCII
В Юникоде первые 128 символов тоже совпадают с соответствующими символами US-ASCII.
Кодировка
Управляющие символы
(После названия каждого символа указан его 16-ричный код)
Структурные свойства таблицы
-
0—9 представляются своими двоичными значениями (например, 5=01012), перед которыми стоит 00112. Таким образом, двоично-десятичные числа (BCD) превращаются в ASCII-строку с помощью простого добавления слева 00112 к каждому двоично-десятичному полубайту. A-Z верхнего и нижнего регистров различаются в своём представлении только одним битом, что упрощает преобразование регистра и проверку на диапазон. Буквы представляются своими порядковыми номерами в алфавите, записанными в двоичной системе счисления, перед которыми стоит 1002 (для букв верхнего регистра) или 1102 (для букв нижнего регистра).
Представление ASCII в ЭВМ
На тех компьютерах, где минимально адресуемой единицей памяти было 36-битное слово, поначалу использовали 6-битные символы (1 слово = 6 символов). После перехода на ASCII на таких компьютерах в одном слове стали размещать либо 5 семибитных символов (1 бит оставался лишним), либо 4 девятибитных символа.
ASCII-коды используются также для определения нажатой клавиши при программировании. Для стандартной QWERTY-клавиатуры таблица кодов выглядит следующим образом:
В этой статье хочу рассмотреть возможности Asciidoc в части обеспечения требований соответствия документов требованиям единой системы конструкторской документации (ЕСКД), конкретно ГОСТ Р 2.105—9 (далее ГОСТ ЕСКД). Почему именно Asciidoc, я писал здесь.
Сразу уточню. Вопрос форматирования документа здесь не рассматривается. Создающий документацию не должен задумываться о форматировании. Как системный аналитик я создаю содержание и контролирую его структуру. Для получения документа, соответствующего ГОСТ ЕСКД или другому аналогичному стандарту, я должен нажать кнопку и получить корректно отформатированный документ в любых требуемых вариантах: pdf, Open Document (Libre
Office/Open Office), Open XML (Microsoft Word) и прочих.
Рассмотрим структуру документа Asciidoc, соответствующего требованиям
ГОСТ ЕСКД.
В пункте 6.1.1 ГОСТ ЕСКД приведена рекомендуемая структура, которую в Asciidoc можно отобразить следующим образом.
Обратите внимание: здесь нет раздела «титульный лист», он определяется настройками форматирования. В титульном листе, как минимум, должно присутствовать наименование документа, а также другие атрибуты: автор, место составления (издания), год составления (издания) и т.п. Эти атрибуты задаются прямо в документе.
Здесь и далее для обозначения идентификаторов используется транслитерация, ГОСТ 7.79-2000 (система Б). Разработчики данного ГОСТ совершили лёгкое вредительство, не позволяющее использовать его для идентификаторов, поэтому мы используем доработанную версию, подробности здесь.
Для некоторых атрибутов предусмотрен упрощенный синтаксис, в данном случае наименование документа вводится первой строкой после одного знака = .
Раздел с содержанием (подраздел 6.2 ГОСТ ЕСКД) заполняется автоматически при генерации документации.
Разделы «Приложение» (подраздел 6.3 ГОСТ ЕСКД), «Библиография» (подраздел 6.4. ГОСТ ЕСКД) и «Предисловие» определены специальными ключевыми словами:
preface даст возможность процессору Asciidoctor понять, что не
нужно включать этот раздел в содержание;
appendix позволит автоматически нумеровать приложения буквами;
bibliography объявляет раздел с библиографическими ссылками
документа.
Список литературы задаём в файле формата BibTeX.
В самом документе необходимо использовать следующий синтаксис.
Требования к делению документов на части определены в подразделе 6.5 ГОСТ ЕСКД. Для деления документа на разделы/подразделы/пункты используется синтаксис:
Атрибут secnums задаёт нумерацию разделов полностью по ГОСТ ЕСКД.
Чтобы Asciidoc отличал пункт от заголовка раздела (особенно, если пункт не имеет заголовка) можно использовать специальную роль, например [.punkt]. Роль задаём над заголовком.
Требования к перечислениям определены в подразделе 6.7 ГОСТ ЕСКД. В Asciidoc перечисления задаются так:
Обратите внимание: у перечисления может быть наименование. В ГОСТ ЕСКД такого понятия нет, но Asciidoc позволяет в печатном документе не отрывать наименование от перечисления. В некоторых случаях это можно использовать.
Можно включать в список дополнительные абзацы, графику и иное содержание. Для этого используют символ + .
В ГОСТ ЕСКД возможно маркировать первый уровень перечислений дефисом. Для этого приведённый пример переоформим следующим образом.
Asciidoc допускает вложенность пунктов до пятого уровня.
В качестве примера рассмотрим таблицу, приведённую на рисунке 1 ГОСТ ЕСКД (пункт 6.8.1).
Результат зависит от настроек форматирования. Заданная выше таблица будет выглядеть приблизительно следующим образом.
Наименование таблицы, как и наименование любых других элементов, вводим через символ «точка». Номер таблицы должен проставляться автоматически в соответствии с правилами форматирования.
В атрибуте cols ( cols = "2,1,1,1,1" ) указано, что в таблице будет 5 колонок, причём первая будет в два раза больше остальных.
В атрибуте hrows указано количество строк в шапке таблицы. Шапка в соответствии с требованиями ГОСТ ЕСКД отображается на каждой странице, если таблица занимает более одной страницы.
Атрибут hrows не поддерживается исходным процессором Asciidoctor и требует специального расширения, в данном случае https://github.com/CourseOrchestra/asciidoctor-plugins. По умолчанию поддерживается только параметр options="header" , предполагающий, что
строка заголовка может быть только одна.
В ГОСТ ЕСКД есть требование помещать слова «Продолжение таблицы» с указанием номера (обозначения) таблицы в начале каждой странице, на которую переносится таблица. Однако пункт 6.8.7 ГОСТ ЕСКД разрешает не указывать эту надпись при подготовке документа с использованием программных средств.
В самой таблице каждая ячейка начинается с вертикальной черты ( | ). Обычно между строками таблицы делают дополнительный перенос строки, так с таблицей легче работать.
Первая ячейка таблицы занимает по вертикали место двух ячеек, поэтому использован синтаксис .2+| . Заголовки граф занимают две ячейки по горизонтали, использован аналогичный синтаксис, но без точки: 2+| .
Для размещения графического материала (подраздел 6.9 ГОСТ ЕСКД) используем следующий синтаксис:
Нумерация рисунков, как и в случае с таблицами делается автоматически.
Если изображение расположено внутри текста, то вместо двух двоеточий необходимо указать одно.
Атрибуты изображения необходимы, чтобы указать, как картинка должна отображаться в документе. Можно воспользоваться имеющимися атрибутами или реализовать свои.
Например, одной из основных проблем при расположении картинок в печатных документах является автоматический подбор их размера. Скажем, ваша диаграмма вытянута по вертикали. Вы добавили вниз еще один элемент, и картинка вылетела за пределы страницы. Или вы добавили элемент справа, который прекрасно влезает по ширине, но неумолимый алгоритм уверен, что главное не менять ширину и уменьшает пропорции картинки, что ведёт к мелким шрифтам и плохой читаемости.
Когда я писал конвертер в Open Document, то решил это добавлением специальных свойств, контролирующих оптимальное расположение. В общем случае проблему придётся решать для каждого выходного формата. Правда, всего один раз. В отличие от использования MS Word, где подгонка каждой картинки лежит на плечах пользователя.
Для процессора Asciidoctor реализовано расширение Asciidoctor Diagram для внедрения непосредственно в текст диаграмм, графиков и других элементов.
Для таких диаграмм используют следующий синтаксис.
Результат должен выглядеть следующим образом:
Оформляют такие диаграммы также, как обычные изображения.
Работа с формулами (подраздел 6.10 ГОСТ ЕСКД) аналогична работе с диаграммами: формулы можно задать прямо в тексте. В следующем примере формула задана на языке LaTeX/Mathematics:
Часто формулы имеют пояснения. Чтобы указать Asciidoc, что абзац является именно пояснением к формуле, необходимо присвоить ему какую-то роль, например.
Ключевое слово stem означает, что формула помещена внутри текстовой строки.
Обратите внимание на символ + в конце строки. Он означает перенос текста на другую строку без завершения абзаца.
Аналогично реализуются другие элементы с фиксированным форматированием: примечания, примеры и т.п. Роль можно присваивать как отдельному абзацу, так и более крупному фрагменту текста.
Ссылки (подраздел 6.11 ГОСТ ЕСКД) в Asciidoc реализованы так: каждому объекту, на который необходима ссылка, присваивают идентификатор. Например, идентификатор для картинки может быть задан в удвоенных парных квадратных скобках:
Для ссылки на данную диаграмму используем следующий синтаксис.
В этом случае текст в документе будет выглядеть так:
Для html-варианта (например, в интерактивной справке) можно вместо текста «рисунок 1» отображать его название.
Не очень красивым выглядит то, что в тексте документа слово «рисунок» повторяется дважды. Но это самый простой вариант, который позволяет с одной стороны соответствовать ГОСТ ЕСКД, а с другой — сохранять падежи при использовании автоматизированной генерации документов.
Для сносок (подраздел 6.13 ГОСТ ЕСКД) в Asciidoc существует специальный синтаксис.
f1 в данном случае — идентификатор сноски, если необходимо поместить её более, чем в одном месте.
Asciidoc позволяет создавать документацию в соответствии с требованиями ЕСКД.
Синтаксис Asciidoc не сложнее самого ГОСТ Р 2.105—9.
Можно забыть о стилях MS Word и сконцентрироваться на содержании
создаваемых документов.
Пожалуй, не найти в информационных технологиях области наиболее похожей на помойку. В этот раз поговорим о том, через какие страдания пришлось пройти в программировании такой абстракции, как текстовые строки . И если до сих пор употребляется выражение "слетела кодировка", то точка в конце этой строки еще не поставлена.
ASCIIZ
В наше время мы привыкли обсуждать сложнейшие концепции фреймворков и высокоуровневых языков программирования . Это злосчастное определение "высокоуровневый" приравнивается к "высокопрофессиональный" или чему-то подобному высокопарному. Однако, эти высокие замки строятся если не из песка, то на песке. Более того, если за дело берется специалист , изучавший программирование и использовавший все это время готовый фреймворк, то песок, на котором будет строиться замок из песка будет еще и зыбучим .
Бурное развитие информационных технологий началось где-то 50 лет назад, когда в университетах появились достаточно доступные компьютеры. До появления первых микрочипов процессоров еще несколько лет, в связи с этим, основной технологией строительства компьютеров и процессоров для них являлась пайка простейших микросхем вроде 14-контактных 2ИЛИ-НЕ.
Устройство и внешний вид микросхемы с вентилями 2ИЛИ-НЕ Устройство и внешний вид микросхемы с вентилями 2ИЛИ-НЕНа базе такого сурового компьютера ( PDP-11 ) широко использовалась одна из первых концепций текстовых строк.
Декларация нуль терминированной строки, содержание которой в области данных по адресу MSG Декларация нуль терминированной строки, содержание которой в области данных по адресу MSGЭто, так называемые, строки с завершающим нулем . Они же нуль-терминированные строки (ASCIIZ).
Главной особенностью такого хранилища букв является их кодирование по таблице ASCII и самое главное - окончание строки это нулевой байт .
Содержание таблицы ASCII. Код символа это два 16-ричных числа: старшее - номер строки, младшее - номер столбца. Содержание таблицы ASCII. Код символа это два 16-ричных числа: старшее - номер строки, младшее - номер столбца.Недостатки ASCIIZ строк
Что касается таблицы кодирования букв. Вы заметили тут символы кириллицы ? Вот именно) Их тут нет. С самого порога нам предложили учить английский язык или убираться из IT. Ни немцы, ни французы ни советские граждане абсолютно не расстроились, а приняли свои кодировки символов алфавитов. И то, что эта идея пришла в голову всем одновременно стало настоящей бедой.
Свойственные другим языкам буквы расположились после адреса 7F в вышеуказанной таблице. Понятное дело, попытка открыть болгарский текст используя русский текстовый редактор оканчивалась удивленными глазами читателя, смотрящими на бессмыслицу. Для описания эффекта был введен жаргонный термин "кракозябры".
Кроме того, что мы сами себе придумали кодировку, для нас постаралась и Microsoft . Даже русскоязычный текст можно записать в разной кодировке. При чтении текста программой можно было увидеть "Я СБЮФЕМХЕЛ", что означало всего лишь "с уважением".
Две различные кодировки для букв русского алфавита Две различные кодировки для букв русского алфавитаНаиболее опасными последствиями использования нуль-терминированных строк были и есть: падение производительности при операциях над текстом и возможность хакерской атаки через переполнение хранилища длинной строкой, не влезающий хвост который хлестал по адресу возврата из функции. Возврат по адресу, нужному хакеру давал ему возможность исполнить свой код. Для лучшего понимания на этом канале есть статья про вызовы функций и стек .
Почему-же столь минималистичная конструкция ставит на колени производительность процессора? Дело в том, что в ней нет места для хранения такой сверхважной характеристики, как ее длина . Попробуйте создать простейший текстовый редактор, где нужно копировать и вставлять фрагменты текста друг в друга и все станет понятно. Без знания длины строк этого не сделать. А как вычислить длину строки? Оказывается, нужно пошагово дойти от ее первого символа до нуля (окончание строки). Пошагово, друзья). А как же функция strlen() , возвращающая длину строки? С прискорбием сообщаю, что у нее под капотом пошаговая проверка на нулевое окончание строки. В-общем,
нуль терминированные строки это сплошной стыд, который за годы программистского труда проник в кучу софта по всему миру.
Pascal строки
Разработчики компилятора одного популярного в тот момент языка программирования решили проблему без всяких изысков. Почему бы не поместить нулевым байтом размер строки?
Один байт это очень мало, он ограничивает максимальный размер строки до 255 символов. Впрочем, это новшество также растворилось в миллионах строк кода. Это на самом деле решило проблему производительности, но только за исключением тех гастарбайтерских творений где самое лучшее было вроде этого:
Если кто-то не заметил, это Pascal строка, оканчивающаяся нулем . Стыд? Безусловно. Производительность поднялась, но защиты от хакеров никакой.
Стоит отметить, что такие строки стали основой программного продукта всемирной известности Microsoft Excel . Если не изменяет память, длина строки там ограничивалась 255 символами.
Решение азиатской проблемы
Когда проблемы кодировок букв, скорости обработки и безопасности превысили все терпимые пределы, начали появляться более универсальные решения. Попытка учесть все многообразие языков нашей планеты привела к созданию набора символов Unicode .
Самое большое заблуждение программистов это считать, что Unicode является 16-битными кодами c возможностью кодирования 65536 различных символов. Если посмотреть на коды слова "Hello", то это, действительно, будут 16-ричные числа: 0х0048, 0х0065, 0х006С, 0х006С, 0х006F . А как на счет того, что разные архитектуры процессоров предусматривают различный порядок хранения старших и младших байт? Одно неверное движение и "Hello" уже совсем не "Hello". Вынужденной мерой стало введение в состав строки двух байт, являющихся маркером порядка байтов. Что-то начинается уже немного стыдно.
Перерасход байт на хранение строк с английскими буквами (лишние нули!) привел к противоречивому решению. Для всех символов, что умещаются в 1 байт и будет выделяться 1 байт, но зато остальным национальным алфавитам прийдется не сладко. А кого из англосаксов когда волновали чужие проблемы? Держите все те, кто не может произнести "the" без акцента:
- Английские буквы (коды 0x00-0x7А) 1 байт на каждую : 0bbbbbbb
- Прочие: (коды 0x80-0x7FF) 2 байта на букву: 110bbbbb 10bbbbbb
- (коды 0х800-0хFFFF) 3 байта на букву: 1110bbbb 10bbbbbb 10bbbbbb
- и так далее вплоть до 5 байт на букву..
1 или 0 означают фиксированные биты префикса , b -любые биты. По префиксу можно понять в какой части таблицы нужно искать изображаемый символ.
По мне, так ужас какой-то. Одно ясно -
строка не имеет никакого смысла если не знать кодировку.
В корне всех бед, в частности, когда пользователь вместо "Привет" получает ". " лежит уверенность программиста в том, что текст это ASCII код и кодировка в нем такая, как он думает.
Эпилог
Это все далеко не полный перечень попыток закодировать буквы национальных алфавитов. Программисты на сегодняшний день худо-бедно научились не показывать нам ". . ?" Помогают им в этом подсказки в разметке HTML страниц вроде: Content-Type: text/plain; charset="UTF-8" , также масса различных классов-абстракций со своими системами хранения строк ( std::string , CString , String , wstring , QString и прочие). Эти классы в языках программирования обладают свойствами, среди которых теперь обязательным является длина строки . Как мы теперь точно знаем, это практически синоним безопасности и производительности. Методы этих классов способны конвертировать один формат представления в другой. Конечно, далеко не в каждый известный формат, но этого и не требуется. Работает хоть как-то и уже хорошо.
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.
Также не обойдите вниманием канал на YouTube . Подписки и лайки будут приятным ответом от аудитории.
Нуль-терминированная строка или C-строка (от названия языка Си) или ASCIIZ-строка — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (NUL из а ASCII, со значением 0).
Содержание
Описание [ | ]
Например, в строковом буфере (области памяти, выделенной для хранения строки) размером 11 байт нуль-терминированная строка «СТРОКА» в ировке Windows-1251 может представляться следующим образом:
С | Т | Р | О | К | А | NUL | F | % | NUL | 4 |
0xD1 | 0xD2 | 0xD0 | 0xCE | 0xCA | 0xC0 | 0x00 | 0x46 | 0x25 | 0x00 | 0x34 |
В данном примере представлена область памяти из 11 байт, хотя на самом деле строка занимает всего 7. Символы после нуль-символа (8 - 11 байты) называются мусором — это данные, которые могли остаться в буфере от предыдущих строк или от других использований памяти. Среди них также могут находиться нулевые символы.
При использовании однобайтных ировок (ASCII) объём памяти, требуемый для представления строки из N символов, равен N + 1 байт. В том случае, когда для ирования символов применяется Юни, длина строки зависит от используемого представления Юниа (например, 2N + 2 байта для UCS-2).
Такие строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах, операции для работы с нуль-терминированными строками появились в Паскале и других языках.
- быть уверенным, что не случаются переполнения буфера;
- аккуратно проводить управление памятью, выделяемой под строки;
- следить за корректной нуль-терминацией строк при использовании функций, которые её не гарантируют (например, strncpy);
- в редких случаях, когда размер строки может быть очень велик, следить, что не происходит переполнение целого при подсчёте длины и прочих связанных с длиной вычислениях.
Кроме того, некоторые операции со строками, например, конкатенация, для нуль-терминированных строк выполняются медленнее, чем для других типов строк.
Сравнение с альтернативами [ | ]
Альтернативой нуль-терминированным строкам являются способы, принятые в Паскале и современных ООП-языках. В Паскале строка начинается с первого элемента массива, а в нулевом элементе хранится длина строки. В этом случае не требуется специального терминатора для обозначения конца строки. С другой стороны, здесь на длину строки накладывается ограничение, связанное с вместимостью нулевого элемента массива, то есть в случае с однобайтовыми элементами длина строки не может превышать 255 символов. Нуль-терминированные строки такому ограничению не подвержены и теоретически могут хранить строки любой длины. В объектно-ориентированных языках применяется хранение записи с длиной строки и ссылкой (или указателем) на массив символов. Эти способы не подвержены недостатку нуль-терминированных строк: они могут хранить в себе нуль-символы без искажений и специального ирования.
В языке Си [ | ]
Для работы с нуль-терминированными строками в языке программирования Си используется ряд функций:
В языке ассемблера [ | ]
Читайте также: