Все статьи

Пробелы и невидимые символы: скрытая причина странных багов

В русской типографской традиции неразрывный пробел — не техническая мелочь, а правило хорошего тона: справочники редакторов (например, «Справочник издателя и автора» Мильчина) рекомендуют ставить его между инициалами и фамилией («А. С. Пушкин» → «А. С. Пушкин») и между числом и единицей измерения («5 кг»), чтобы эти пары никогда не разрывались переносом строки.

Почему это вызывает странные баги

Тот же символ, который в вёрстке решает эстетическую задачу, в коде создаёт незаметный баг: сравнение строк неожиданно возвращает «не равны», хотя текст на экране выглядит идентично. Причина часто в том, что одна строка содержит обычный пробел, а другая — неразрывный пробел, скопированный, например, из Word или с веб-страницы. Визуально разницы нет, для компьютера — есть.

Тримминг (trim)

Trim убирает пробельные символы с начала и конца строки, оставляя содержимое внутри неизменным. Это стандартная операция очистки пользовательского ввода — случайный лишний пробел в начале поля формы не должен влиять на сравнение или валидацию значения.

Схлопывание пробелов

Другая распространённая операция — замена нескольких последовательных пробельных символов одним. Это полезно для текста, скопированного из форматированного источника (например, PDF или таблицы), где могут быть случайные двойные пробелы или табуляции вместо одного пробела.

Зачем это нужно

  • Продиагностировать, почему сравнение двух на вид одинаковых строк не проходит.
  • Очистить текст, скопированный из другого источника, от лишних и невидимых символов, включая случайно попавшие неразрывные пробелы.
  • Нормализовать пользовательский ввод перед сохранением в базу данных.

Символы нулевой ширины

Кроме видимых пробельных символов существуют символы нулевой ширины (zero-width space, zero-width joiner) — они вообще не занимают места на экране, но присутствуют в тексте как отдельные символы. Такие символы иногда попадают в текст при копировании с некоторых сайтов или мессенджеров и могут незаметно сломать сравнение строк или поиск, оставаясь полностью невидимыми даже в текстовом редакторе.

Попробовать инструмент