Усі статті

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

Не всі пробільні символи однакові. Окрім звичайного пробілу є табуляція, невидимий non-breaking space ( ), нульової ширини пробіл і різні символи переносу рядка — і всі вони можуть виглядати однаково на екрані, лишаючись різними символами для комп’ютера.

Чому це спричиняє дивні баги

Найкласичніший приклад — порівняння рядків, яке несподівано повертає «не рівні», хоча текст на екрані виглядає ідентично. Причина часто в тому, що один рядок містить звичайний пробіл, а інший — non-breaking space, скопійований, наприклад, із веб-сторінки. Візуально різниці немає, для комп’ютера — є.

Тримінг (trim)

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

Схлопування пробілів

Інша поширена операція — заміна кількох послідовних пробільних символів одним. Це корисно для тексту, скопійованого з форматованого джерела (наприклад, PDF чи таблиці), де можуть бути випадкові подвійні пробіли чи табуляції замість одного пробілу.

Навіщо це потрібно

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

Символи нульової ширини

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

Спробувати інструмент