Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Для чего создан символ “U+0000”?

Недавно наткнулся на символ, которого нет. То есть он, в отличии от U+200C или U+200B, даже не печатается. Так для чего он тогда нужен?


Ответ

U+0000 существует в Юникоде для совместимости с более старыми стандартами, которые создавались в эпоху когда ещё биты физически на бумаге с помощью дырок выставляли.

Аналог предшествующих стандартов на русском (ГОСТ 27465-87) определяет ПУС символ (ПУСТО) как:
Символ, назначением которого является заполнение носителя или временного интервала. Символ ПУС может быть введен в поток информации или исключен из него без оказания влияния на содержание информации, в этом случае прибавление или исключение этого символа может повлиять на размещение информации и (или) управление аппаратурой
Поэтому вывод:

>>> print('\u0435\u0308') ё
и:
>>> print('\u0435' + '\0'*1000 + '\u0308') ё
может выглядеть одинаково, хотя вторая команда печатает на тысячу символов больше.
Намерение стандарта (как я его понимаю), в том что битовое представление символа ПУСТО не имеет дырок (например, из одних нулей состоит, если 1 соответствует дырке), не оставляет следов на бумаге -- поэтому можно использовать ПУС, чтобы к примеру зарезервировать место на перфоленте для будущих вставок или просто дать время аппаратуре предыдущие действия закончить (аналог NOP инструкции, которая предписывает ничего не делать).
На практике, \0 байт (который может превратиться в U+0000 Юникодный символ при декодировании, используя основанную на ascii кодировку) может служить индикатором конца строки (в C) или разделителем отдельных строк в текстовом потоке (NUL как правило не может встретиться внутри ожидаемых строк, поэтому этот символ служит хорошим разделителем).
К примеру, find -print0 команда печатает пути, разделённые NUL (\0 не может быть частью имени файла в *nix) -- это позволяет обрабатывать файлы с экзотическими именами, содержащие новые строки или любые другие байты. Вот конкретный пример кода, который получает переменные окружения из дочернего процесса, используя env -0 команду (\0 байт разделяет отдельные записи, так как переменная окружения на POSIX не может содержать NUL) -- Calling the “source” command from subprocess.Popen

Комментариев нет:

Отправить комментарий