пятница, 18 февраля 2011 г.

PHP Output Buffering, UTF8 и HTTP-заголовки

Рассмотрим файл index.php

<?php
ob_start();
echo "I'm just a loser and slowpoke!";
header "location: nooooooooooooooo.com";
ob_end_flush();
?>

Суть в том, что если файл сохранен в UTF8 с BOM, в 4 строке вылетит ошибка. Смотрим вики:

Порядок байтов
В потоке данных UTF-16 старший байт может записываться либо перед младшим (англ. UTF-16 big-endian), либо после младшего (англ. UTF-16 little-endian). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE.
Для определения формата представления Юникода в текстовом файле используется приём, по которому в начале текста записывается символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый меткой порядка байтов (англ. byte order mark, BOM). Этот способ позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также он иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов.
PHP отправляет тот самый символ, и, как следствие, отправить заголовок уже нельзя. Решение — при использовании буферизации вывода использовать UTF8 без BOM.

Комментариев нет:

Отправить комментарий