Archive

Archive for the ‘BOM’ Category

PHP и UTF-8

March 7th, 2010 No comments

Хорошим тоном считается использовать кодировку UTF-8, несмотря на то, что большинство сайтов рунета до сих пор работают на Windows-1251. В статье я расскажу, что же именно нужно сделать, чтобы PHP сайт правильно заработал с Юникодом, и с каким трудностями мне пришлось столкнуться на пути к прогрессу.

Достаточно ли тега meta?

Вот мой index.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<title>UTF-8</title>
</head>
<body>
	Здравствуй, UTF-8!
</body>

Сохраняю файл в кодировке UTF-8 и вижу в браузере каркозябры. Это меня не может не удивлять, потому что в теге meta указана верная кодировка.

Несмотря на это, все браузеры упорно считают, что документ пришел в Windows-1251.

utf8

Почему?

Статичная страница вместо скрипта

Пробую поменять расширение файла на «.html» и, о чудо! Я вижу надпись «Здравствуй, UTF-8!» Значит, дело в PHP…

Заголовки ответа

А не отправляет ли сервер кодировку в заголовке ответа? Запускаю мониторинг HTTP (как это сделать?) и вижу вот что:

Content-type: text/html; charset=windows-1251

То есть сервер считает, что страница должна быть в кодировке Windows-1251, о чем говорит браузеру заголовком Content-type.

Решение проблемы

Решить проблему можно двумя способами:

  1. Написать в начале скрипта (перед выводом HTML):

    <?php
    header('Content-type: text/html; charset=utf-8');
    ?>
  2. Указать в .htaccess нужную кодировку:

    AddDefaultCharset utf-8

Оба варианта приведут к одному и тому же – сервер вернет нужный нам заголовок:

Content-type: text/html; charset=utf-8

Для чего же тогда тег meta?

Для статичных страничек или же, если пользователь сохранит документ для автономной работы.

Метка BOM

Работая в кодировке UTF-8, нужно знать про злую метку BOM. Это такая последовательность байт, которая идет в начале файла и «помогает» понять кодировку. Однако для PHP эта метка оказывает медвежью услугу. Последовательность байт просто выводится в OUTPUT, в результате чего возникают разные неприятные вещи.

Например, IE отказывается реагировать на директиву DOCTYPE (видимо, он ее ждет в самом начале файла, а там BOM). Если вы используете шаблоны, и для вывода HTML используется несколько файлов, то браузер будет отображать отступы в местах стыка шаблонов.

Решение проблемы – использовать UTF-8 без BOM. Многие редакторы позволяют это делать, например, Notepad++:

bom