Неразрывные пробелы в рукописном шрифте: как проверить U+00A0 и U+202F

Неразрывный пробел удерживает знак рядом с числом или соседним словом при переносе строки. Например, рядом остаются цена и рубль, значение и единица измерения, номер и обозначение. Для шрифтового проекта важно подобрать ширину пробелов, обеспечить доступность по нужным кодам и не допустить подмены шрифтом системы.
Что именно удерживает неразрывный пробел
Обычный пробел U+0020 обычно разрешает перенос после себя. U+00A0 NO-BREAK SPACE и U+202F NARROW NO-BREAK SPACE несут другую информацию для алгоритма разбивки строки: по правилам Unicode они соединяют соседей, не позволяя перенести строку по обе стороны пробела. Узкий вариант ведёт себя при переносах так же, но имеет более узкую ширину отображения. Это поведение описано в Unicode Standard Annex #14.
Например, если цена оказалась у правого края строки, обычный пробел может оставить знак рубля на следующей строке. В записи 450 ₽ между числом и знаком стоит U+00A0: их пара должна перейти на новую строку целиком. Так же можно проверить 18 °C, 6,5 % или № 12. Пробел остаётся видимым, но его семантика отличается от обычного пробела.
Сначала определите проблему макета, а затем выбирайте символ. Если нужно сохранить видимый промежуток и связать две части, подходят NBSP или NNBSP. Если нужно соединить символы без видимого промежутка, это уже другая задача; невидимый WORD JOINER U+2060 можно рассматривать для неё отдельно. Не заменяйте им пробел между числом и единицей: он не создаёт нужного интервала.
Чем различаются U+00A0 и U+202F
U+00A0 — стандартный неразрывный пробел с обычным межсловным назначением. U+202F — узкий неразрывный пробел. Unicode указывает одинаковое поведение этих знаков при переносе; различие относится к ширине отображения. На практике выбор зависит от набора текста, редакционных правил и того, какое расстояние нужно видеть между связанными частями.
Не следует превращать эту разницу в универсальное правило вида «всегда ставьте узкий» или «всегда ставьте обычный». Типографические рекомендации могут зависеть от языка, издания, программы и конкретного сочетания. Сверьтесь с правилами проекта и проверьте реальный макет. Если источники текста уже содержат один из кодов, не меняйте его на другой автоматически, не понимая, какую задачу решал автор.
Три пробела в примерах ниже выглядят похожими, но являются разными кодами. Первые два удерживают соседей от переноса; третий обычно даёт место переноса после себя.
450 ₽— U+00A0 NO-BREAK SPACE.450 ₽— U+202F NARROW NO-BREAK SPACE.450 ₽— U+0020 SPACE.
В браузере, текстовом редакторе или поле ввода визуальная разница между ними иногда едва заметна. Поэтому не определяйте код по виду: используйте инспектор символов или проверку кодовых точек.
Что проверить в самом шрифте
У пробелов нет видимого контура, поэтому их легко пропустить в нарисованном наборе. Однако невидимость не означает, что ширина и доступность символа не важны. При создании шрифта проверьте, что U+00A0 и, если проекту нужен, U+202F присутствуют в кодовой карте и отображаются ожидаемым глифом. Для NBSP часто разумно сохранить ширину обычного пробела; для NNBSP задайте более узкую ширину, соответствующую принятому в проекте решению.
Точное значение ширины нельзя выбрать в вакууме. Сравните пробелы в выбранном шрифте с соседними знаками: промежуток не должен выглядеть как случайная дырка или слипаться с числом. Проверьте кириллические и латинские цифры, десятичную запятую, знак валюты, градус и буквы единиц. Рукописный шрифт может иметь неровный ритм, поэтому визуально одинаковая ширина не всегда выглядит одинаково.
Проверьте именно кодовую карту экспортированного файла, а не только рабочий проект. Если код U+202F отсутствует, приложение может незаметно взять его из запасного системного шрифта. Тогда строки останутся на месте, но узкий промежуток будет выглядеть иначе, чем остальные пробелы. Сравнение одного и того же теста при включённом и отключённом fallback помогает обнаружить такую подмену.
Как собрать тестовую строку
Сделайте пробу, в которой одни и те же значения повторяются с тремя видами пробела. Используйте длинную узкую колонку, чтобы строки действительно переносились. Пример набора: 450 ₽, 450 ₽, 450 ₽; 18 °C, 18 °C, 18 °C; № 12, № 12, № 12. Между обычными пробелами в первой группе и остальными символами оставляйте реальные кодовые точки, не имитируйте их дополнительными пробелами или ручными переносами.
Проверяйте поведение на границе строки, а не в свободной строке. Постепенно сужайте колонку, пока обычный пробел допускает перенос пары, а неразрывный удерживает её вместе. Затем расширьте колонку и сравните оптический промежуток. Проба должна показать две вещи отдельно: где возможен перенос и как выглядит ширина до переноса.
Чтобы не перепутать похожие символы, скопируйте примеры в простой текстовый файл и выведите кодовые точки программно. В Python ord() покажет номер символа; для невидимых пробелов ожидайте U+0020, U+00A0 и U+202F. Если после копирования редактор заменил пробелы или очистил форматирование, заново вставьте символы из таблицы символов либо создайте строки программно.
Для теста шрифта полезно добавить «контрольную» запись со словом до и после пробела, например образец текста, а для макета — пары чисел с разной длиной: 8 ₽, 450 ₽, 12 345 ₽. Они показывают, одинаково ли ведут себя короткие и длинные значения рядом со знаком. Не делайте вывод по одному крупному заголовку: ширина колонок, кегль и способ выравнивания могут скрыть ошибку.
Последовательность проверки перед экспортом
- Составьте список нужных сочетаний. Выпишите валюты, единицы, номера, даты или другие группы, которые действительно встречаются в продукте. Не добавляйте символы только ради количества.
- Вставьте настоящие кодовые точки. Создайте для U+00A0 и U+202F отдельные тестовые строки и проверьте их коды. Пробел, нарисованный вручную, не заменяет символ в тексте.
- Проверьте покрытие шрифта. Убедитесь, что оба символа доступны в экспортированном файле или что проект осознанно использует выбранную подстановку. Проверьте ширину глифа и отсутствие случайного контура.
- Сымитируйте перенос. Поместите пары у правого края узкой колонки, уменьшайте ширину постепенно и проверьте, что переносится вся пара.
- Сравните ширину и ритм. Посмотрите на пробел при том же кегле и в том же контексте, где он будет использоваться. Убедитесь, что узкая версия действительно выглядит узкой, если она нужна.
- Повторите тест после экспорта. Откройте файл в целевом приложении и проверьте, что оно выбрало нужный шрифт, а не fallback. Веб-страницу тестируйте в реальном браузере и CSS-контейнере.
- Сохраните образцы. Добавьте строки с обычным и неразрывным пробелом в контрольный документ проекта, чтобы следующий экспорт можно было сравнить с предыдущим.
Где обычно возникает ошибка
Частая ошибка — заменить обычный пробел неразрывным во всём документе. Это удерживает слишком большие группы текста вместе и может создавать некрасивые пустоты в строках или переполнение узких блоков. Связывайте только те элементы, разрыв между которыми меняет чтение или смысл: значение и единицу, обозначение и номер, цену и валютный знак — если так решено в правилах вашего макета.
Вторая ошибка — поставить обычный пробел непосредственно перед NBSP, рассчитывая, что непереносимая пара приклеится к предыдущему слову. Алгоритм Unicode допускает разрыв после обычного пробела; при переносе видимый пробел может уйти на новую строку вместе с NBSP. Вводите одну нужную границу: между связанными элементами — NBSP или NNBSP, а не последовательность SPACE + NBSP.
Третья ошибка — выбрать узкий пробел только по его названию и не посмотреть на реальный шрифт. Имя символа не гарантирует правильную ширину в конкретном файле, особенно если он отсутствует и отрисовывается запасным шрифтом. Проверяйте код, карту глифов и отпечатанный или экранный результат в одном месте.
Четвёртая ошибка — тестировать в строке, которая и так помещается целиком. Такой образец ничего не говорит о переносе. Пятая — вручную вставить перенос в редакторе, а затем решить, что символ работает: ручной перенос проверяет редакторскую команду, а не алгоритм строки. Используйте естественную ширину колонки и несколько значений, расположенных близко к её правому краю.
Наконец, не принимайте подмену шрифта за проблему ширины исходного глифа. Если в одном приложении интервал узкий, а в другом обычный, проверьте фактически применённый файл, список fallback и поддержку символа в обоих местах. Сначала подтвердите кодовую точку, затем измеряйте ширину.
Короткий чек-лист
Перед выпуском проверьте:
- Нужные строки содержат U+00A0 или U+202F, а не похожий U+0020.
- Каждое неразрывное сочетание обосновано макетом, а не массовой заменой.
- NBSP и NNBSP присутствуют в кодовой карте либо подстановка явно предусмотрена.
- Ширина символов согласуется с остальными пробелами и выбранным стилем.
- На узкой колонке связанные элементы переносятся вместе.
- Экспортированный файл тестируется в целевом редакторе или браузере без незаметного fallback.
- Сохранён контрольный пример до и после изменения шрифта.
Частые вопросы
Можно ли назначить U+00A0 и обычному пробелу один глиф?
Во многих шрифтовых проектах это приемлемое решение, если визуальная ширина должна совпадать. При этом в тексте остаются разные кодовые точки, поэтому неразрывное поведение задаётся символом и алгоритмом строк, а не рисунком глифа. После экспорта убедитесь, что приложение действительно видит код U+00A0.
Обязан ли U+202F быть уже U+00A0?
Unicode называет его узким неразрывным пробелом и описывает более узкое отображение при таком же поведении переноса. В конкретном шрифте проверьте реальную ширину и согласуйте её с правилами проекта; наличие отдельной кодовой точки само по себе не исправляет неверную метрику или fallback.
Чем WORD JOINER отличается от неразрывного пробела?
WORD JOINER U+2060 предназначен для запрета переноса без видимого пробельного промежутка. NBSP и NNBSP сохраняют видимый интервал. Поэтому для связки «число + единица» или «№ + номер» обычно нужен именно пробел, а не нулевая ширина.
Почему перенос сохраняется, но расстояние выглядит чужим?
Возможны разные причины: для сочетания выбран не тот тип пробела, ширина глифа в файле не соответствует стилю или приложение использует резервный шрифт. Сравните отображаемую кодовую точку, фактически загруженный файл и ширину символа в тестовом образце.
Нужно ли добавлять оба символа в каждый рукописный шрифт?
Добавляйте тот набор символов, который требуется сценариям проекта. Если тексты содержат U+202F, проверьте его отдельно; если нет, фиксируйте решение и поддерживаемый набор. Для Fontgenerator удобно сначала определить будущие тексты, а затем составить перечень нужных знаков.
Как понять, что тест проверяет именно шрифт?
Откройте образец в целевом приложении, подтвердите название применённого шрифта и проверьте кодовые точки. Сравните результат после экспорта с исходным проектом. Если неизвестно, какой шрифт отображает пробел, визуальная оценка не докажет, что его метрика взята из вашего файла.
Итог
Неразрывный пробел — невидимый, но проверяемый знак. Разведите в тесте три задачи: кодовая точка, поведение переноса и визуальная ширина. Так вы сохраните рядом число и знак, не превратив каждый обычный промежуток в запрет на перенос. Составить и проверить набор символов для собственного почерка можно с помощью Fontgenerator.
Источники
- Unicode Standard Annex #14: Unicode Line Breaking Algorithm — классы переноса и поведение U+00A0 и U+202F.
- Unicode Character Database — актуальные значения свойства Line_Break.