Лишние пробелы в тексте: откуда берутся и как их убрать
Почему во вставленном тексте столько двойных пробелов и невидимых символов, что из-за них ломается и как вычистить документ за пару секунд.
ВПР, который отказывается находить совпадение. Поиск, который ничего не выдаёт, хотя слово прямо на экране. Поле с именем, которое сортируется не туда. В девяти случаях из десяти виноват пробел, которого не видно.
Удаление лишних пробелов вычищает их и показывает, сколько нашлось.
Откуда берётся весь этот мусор
Привычки набора — самый очевидный источник. Кого учили печатать на машинке, тот ставит два пробела после точки, и эта традиция пережила сами машинки лет на пятьдесят. Текстовые редакторы добавляют своё: 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, выключите «Обрезать каждую строку», иначе сломаете файл. Для обычного текста обрезайте смело.
Текст всё время остаётся в браузере. Ничего не загружается на сервер, так что договоры и клиентские документы вставлять можно спокойно.
Почистите документ прямо сейчас и посмотрите, что в нём пряталось.