Один пробел — не всегда тот же символ

На экране два пробела могут выглядеть одинаково, но компьютер сравнивает не их внешний вид, а коды символов. Обычный пробел, неразрывный пробел и пробел нулевой ширины — разные знаки. Последний может быть вообще невидимым; неразрывный пробел выглядит как обычный, но предназначен для другого: например, чтобы не разрывать строку в типографском тексте.

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

Как найти невидимую помеху

Если сообщение об ошибке указывает на строку, где всё кажется верным, стоит проверить символы вокруг отмеченного места. Редакторы кода умеют показывать пробелы и табуляцию специальными значками; некоторые также подсвечивают символы, не входящие в обычный ASCII — базовый набор латинских букв, цифр и знаков. Можно удалить подозрительный участок и набрать его заново в редакторе кода, а не вставлять из документа.

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