Пробел в Unicode¶
Пробел — управляющий символ, используемый для разделения слов и отступов в тексте; в стандарте Unicode ему соответствует несколько отдельных кодовых точек, из которых основной является U+0020 (SPACE). Пробел относится к категории управляющих символов (Zs — Separator, space) и занимает в таблицах Unicode отдельную группу разделителей. Таким образом, пробел действительно является символом в Unicode, однако это не один символ, а целое семейство кодовых точек с разным поведением.
¶Основные символы пробела в Unicode
Стандарт Unicode предусматривает несколько видов пробелов, отличающихся назначением и визуальной шириной:
| Название | Кодовая точка | Категория | Описание |
|---|---|---|---|
| SPACE (обычный пробел) | U+0020 | Zs | Основной пробел, разделяющий слова |
| NO-BREAK SPACE (неразрывный пробел) | U+00A0 | Zs | Не допускает переноса строки между словами |
| EN QUAD | U+2000 | Zs | Ширина равна ширине цифры «en» |
| EM QUAD | U+2001 | Zs | Ширина равна ширине эм-квадрата |
| EN SPACE | U+2002 | Zs | Ширина «en» |
| EM SPACE | U+2003 | Zs | Ширина «em» |
| THREE-PER-EM SPACE | U+2004 | Zs | Три пробела на ширину «em» |
| FOUR-PER-EM SPACE | U+2005 | Zs | Четыре пробела на ширину «em» |
| SIX-PER-EM SPACE | U+2006 | Zs | Шесть пробелов на ширину «em» |
| FIGURE SPACE | U+2007 | Zs | Ширина цифры |
| PUNCTUATION SPACE | U+2008 | Zs | Ширина знака препинания |
| THIN SPACE | U+2009 | Zs | Узкий пробел (¼ эм) |
| HAIR SPACE | U+200A | Zs | Волосяной пробел (⅛ эм) |
| NARROW NO-BREAK SPACE | U+202F | Zs | Узкий неразрывный пробел |
| MEDIUM MATHEMATICAL SPACE | U+205F | Zs | Математический пробел |
| IDEOGRAPHIC SPACE | U+3000 | Zs | Ширина иероглифа (используется в CJK) |
Все перечисленные символы относятся к категории Zs и визуально отображаются как пустое пространство, но для компьютера это разные символы с разными номерами.
¶Кодировка UTF-8
В кодировке UTF-8 обычный пробел U+0020 занимает один байт со значением 0x20 (32 в десятичной записи). Это совпадает с позицией пробела в ASCII, поэтому UTF-8 является обратно совместимым с этой кодировкой. Неразрывный пробел U+00A0 в UTF-8 кодируется двумя байтами: 0xC2 0xA0. Широкие пробелы из блока General Punctuation (U+2000–U+200A) кодируются тремя байтами вида 0xE2 0x80 0xNN.
¶Пробел в других кодировках
До распространения Unicode тексты в русскоязычной среде кодировались в стандартах KOI-8-R, Windows-1251 и ISO 8859-5. Во всех этих однобайтовых кодировках позиция 0x20 отведена обычному пробелу, что обеспечивало совместимость с ASCII. Неразрывный пробел в Windows-1251 имеет код 0xA0, в KOI-8-R — 0xA0, что совпадает с позицией в Latin-1.
¶Технические особенности
¶Обработка в программировании
Множество языков программирования и библиотек предоставляют отдельные функции для работы с пробелами. В Python, например, метод str.isspace() возвращает True для всех символов категории Zs, а не только для U+0020. Регулярные выражения в синтаксисе Perl используют конструкцию \s, которая по умолчанию сопоставляется с пробелом, табуляцией, переводом строки и рядом Unicode-разделителей.
¶Пробел в формате JSON
Согласно спецификации JSON (RFC 8259), структурные символы могут разделяться пробелами, табуляцией, переводами строк и carriage return. Неразрывный пробел U+00A0 формально не входит в этот список, хотя некоторые парсеры принимают его как валидный разделитель.
¶Пробел в URL
В URL-адресах обычный пробел не допускается и должен кодироваться как %20 или как плюс + в компоненте query. Неразрывный пробел также требует процентного кодирования.
¶Применение неразрывного пробела
Неразрывный пробел U+00A0 применяется в типографике для предотвращения переноса строки между элементами, которые должны оставаться вместе: между числом и единицей измерения, между инициалами и фамилией, перед знаками препинания «?», «!», «:» в ряде языковых традиций. В текстовых редакторах вроде Microsoft Word и LibreOffice неразрывный пробел вставляется сочетанием клавиш Ctrl+Shift+Space.
¶Пробел и сортировка
В Unicode-сортировке (алгоритм UCA, Unicode Collation Algorithm) пробел обычно игнорируется или имеет очень низкий вес, что позволяет сравнивать строки без учёта пробельных различий. Однако точное поведение зависит от настроек локали и используемого уровня сопоставления.
Источники:
- The Unicode Standard, Version 15.0 — Chapter 2. General Structure
- Unicode Character Database — Category Zs (Separator, space)
- RFC 8259 — The JavaScript Object Notation (JSON) Data Interchange Format
- RFC 3629 — UTF-8, a transformation format of ISO 10646
- ГОСТ Р ИСО/МЭК 10646 — Информационные технологии. Универсальный набор символов
