Маркер последовательности байтов и BOM символы – как исправить ошибку cannot modify header information 

В мире веб-разработки php является одним из самых распространенных скриптовых языков. Его гибкость и простота использования делают его идеальным выбором для многих разработчиков. Однако, если вы не будете осторожны при работе с текстовыми файлами в вашем php-приложении, вы можете столкнуться с проблемой символов BOM.

Иногда стандартные инструменты для редактирования файлов присваивают им кодировку UTF-8 с BOM меткой. Он отображается в самом начале в формате U+FEFF.

В этой статье мы рассмотрим, что такое BOM-символы, почему возникает ошибка и как её устранить.

Маркер порядка байтов — что это такое?

Маркер последовательности байтов – это специальная последовательность символов, используемая для идентификации порядка байтов в файле. Обычно она записывается как символ Юникода u+feff и появляется в начале файла или потока для обозначения порядка байтов. 

Символы BOM (Byte Order Mark) — это специальные последовательности из двух или нескольких байтов. Они указывают порядок, в котором байты должны быть считаны из файла. Они могут использоваться для различения различных типов кодировок, таких как utf-8, utf-16 и utf-32. Включая эту информацию в заголовок файла, программы могут быстро определить, как интерпретировать его содержимое, не догадываясь о типе кодировки. Это делает обмен данными более простым и эффективным, поскольку программам не нужно пробовать несколько кодировок, пока одна из них не будет работать правильно.

Почему появляется ошибка: Cannot modify header information - headers already sent (output started at script:line)?

Эта ошибка может возникнуть, когда приложение пытается отправить http-ответ с заголовками, которые уже были отправлены другим приложением или скриптом. Обычно это происходит, когда в одном из ваших скриптов присутствует символ BOM перед отправкой любого другого вывода, например, html или текстового содержимого. Поскольку http-заголовки должны идти первыми перед любым другим выводом, если перед ними присутствует любой другой вывод, вы получите это сообщение об ошибке.

В результате возникают проблемы при попытке корректной обработки данных. Это может привести к неожиданным результатам или ошибкам в вашем приложении. Кроме того, нарушается оформление сайта. Например, появляются нечитаемые символы, «уезжают» в сторону блоки.

К счастью, есть способы избежать этой проблемы.

Как исправить ошибку Cannot modify header information 

Чтобы исправить эту проблему, нужно удалить все символы BOM из ваших скриптов перед отправкой любого вывода, такого как html-содержимое или текстовое содержимое. Сделать это можно двумя способами.

Способ №1 – в редакторе.

  1. Откройте редактор Notepad++.
  2. Нажмите вкладку «Кодировки».
  3. Перейдите на пункт Кодировать в UTF-8 (без BOM).

Способ №2 – командой.

  1. Подключаемся к серверу по безопасному протоколу SSH
  2. Проверяем файлы, чтобы узнать, содержат ли они символы BOM.

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

Можете выбрать конкретную директорию для выполнения проверки, для этого сначала зайдите в соответствующий каталог.

  1. Удалите найденные символы BOM.

find . -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

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

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

Всё ещё остались вопросы?