belun.app Блог
EN

Лишние пробелы в тексте: откуда берутся и как их убрать

Почему во вставленном тексте столько двойных пробелов и невидимых символов, что из-за них ломается и как вычистить документ за пару секунд.

Чистый белый лист бумаги на минималистичном столе — текст после удаления лишних пробелов

ВПР, который отказывается находить совпадение. Поиск, который ничего не выдаёт, хотя слово прямо на экране. Поле с именем, которое сортируется не туда. В девяти случаях из десяти виноват пробел, которого не видно.

Удаление лишних пробелов вычищает их и показывает, сколько нашлось.

Откуда берётся весь этот мусор

Привычки набора — самый очевидный источник. Кого учили печатать на машинке, тот ставит два пробела после точки, и эта традиция пережила сами машинки лет на пятьдесят. Текстовые редакторы добавляют своё: Tab в ячейке таблицы, автозамена после переноса строки, вставленный маркированный список.

Хуже — копирование. Когда вы копируете из PDF, из документа Word или с отрисованной веб-страницы, вы получаете не те символы, что видите. Вы получаете то, чем движок вёрстки раздвигал элементы:

  • Неразрывный пробел (U+00A0) — браузеры и Word вставляют его, чтобы строка не переносилась в неудачном месте
  • Полукруглая и круглая шпации (U+2002, U+2003) для типографских отступов
  • Идеографический пробел (U+3000), обычный для японского и китайского текста
  • Соединители нулевой ширины — невидимые символы шириной ровно ничего
  • Маркер порядка байтов (U+FEFF), который обожает прилипать к первому символу файла

Каждый из них выглядит как пробел или как пустота, и ни один из них пробелом для вашего кода не является. Сравнение "Иван Петров" === "Иван Петров" вернёт false, если один из промежутков — U+00A0. Вот и вся ошибка, и можно весь день смотреть на обе строки, ничего не заметив.

Что именно ломается

Импорт CSV разъезжается по колонкам. Запросы к базе не находят строки. Функция СЖПРОБЕЛЫ в Excel убирает только обычные ASCII-пробелы и спокойно оставляет U+00A0 на месте — поэтому классический совет «просто примени СЖПРОБЕЛЫ» не работает на данных, скопированных с сайта.

В URL-слаге посреди строки появляется %C2%A0. Регулярка с \s в JavaScript такие символы всё-таки ловит, а написанная руками [ \t] — нет. А в диффе две одинаковые на вид строки помечаются как изменённые, и на код-ревью это доводит до белого каления.

Как чистить

Вставьте текст в левое поле — очищенная версия появится справа прямо по ходу набора. Правила по умолчанию закрывают большинство случаев.

Повторяющиеся пробелы схлопываются в один. Каждая строка обрезается с обеих сторон. Серии пустых строк сливаются в одну, поэтому разбивка на абзацы остаётся, а провал в шесть строк после неудачной вставки исчезает. Юникодные двойники превращаются в обычные пробелы, символы нулевой ширины удаляются совсем.

Остальное включается вручную. «Удалить пустые строки» собирает всё вплотную — то, что нужно перед вставкой в одну ячейку таблицы. «Заменить табуляции пробелами» выручает с кодом, скопированным из терминала. «Удалить все пробельные символы» сплющивает текст в одну сплошную строку: удобно, когда сравниваете хеши или проверяете base64.

Счётчики внизу показывают символы, строки и слова до и после плюс объём удалённого. На документе в 4000 слов, вставленном из Google Docs, надпись «удалено 312 символов, 1,9%» — неплохая проверка, что инструмент отработал и не съел текст.

Одна оговорка

Обрезка строк уничтожит отступы. Если чистите исходный код или YAML, выключите «Обрезать каждую строку», иначе сломаете файл. Для обычного текста обрезайте смело.

Текст всё время остаётся в браузере. Ничего не загружается на сервер, так что договоры и клиентские документы вставлять можно спокойно.

Почистите документ прямо сейчас и посмотрите, что в нём пряталось.

Попробуйте инструмент

Удаление лишних пробелов →