Установите заголовок HTTP на UTF-8, используя PHP

У меня есть несколько страниц PHP, выводящих различные вещи на страницы HTML со следующим кодом.

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

Тем не менее, когда я проверяю с помощью валидатора W3C, возникает следующее:

Кодировка символов, указанная в заголовке HTTP (iso-8859-1), отличается от значения в элементе (utf-8).

Я новичок в PHP, и мне было интересно, могу ли я и должен ли изменить заголовок для файлов PHP, чтобы он соответствовал файлам HTML.

7 ответов

Решение

Использование header изменить заголовок HTTP:

header('Content-Type: text/html; charset=utf-8');

Обратите внимание на вызов этой функции до того, как какой-либо вывод будет отправлен клиенту. В противном случае заголовок также был отправлен, и вы, очевидно, не сможете его изменить. Вы можете проверить это с headers_sent, Смотрите страницу руководства header для дополнительной информации.

Сначала убедитесь, что сами файлы PHP имеют кодировку UTF-8.

Метатег игнорируется некоторым браузером. Если вы используете только ASCII-символы, это все равно не имеет значения.

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

header('Content-Type: text/html; charset=utf-8');

Эта проблема связана с тем, что ваш веб-сервер отправляет заголовок HTTP, который не соответствует указанному вами. Инструкции о том, как заставить сервер отправлять правильные заголовки, см. На этой странице.

В противном случае вы также можете использовать PHP для изменения заголовков, но это нужно сделать перед выводом любого текста с использованием этого кода:

header('Content-Type: text/html; charset=utf-8');

Более подробную информацию о том, как отправлять заголовки с помощью PHP, можно найти в документации по функции заголовка.

Вы также можете использовать более короткий путь:

<?php header('Content-Type: charset=utf-8'); ?>

См. RFC 2616, он действителен для указания только кодировки.

Для правильной реализации вам нужно изменить ряд вещей.

База данных.(Сразу после подключения):

mysql_query("SET NAMES utf8");
//Meta tag HTML.(probably its already set): 
meta charset="utf-8"
header php.(before any output of the HTML):
header('Content-Type: text/html; charset=utf-8')
table-rows-charset(for each row):
utf8_unicode_ci

PHP отправляет заголовки автоматически, если настроена внутренняя кодировка

ini_set('default_charset', 'utf-8');

Как объяснено на http://php.net/default-charset ,

«UTF-8» является значением по умолчанию, и его значение используется в качестве кодировки символов по умолчанию для htmlentities (), html_entity_decode() и htmlspecialchars(), если параметр кодировки опущен.

Он установлен по умолчанию php.iniкак " UTF-8 " в разделе " Обработка данных " как:

      ; PHP's default character set is set to UTF-8.
; http://php.net/default-charset
default_charset = "UTF-8"

Кроме того, вы можете установить перед содержимым header в другую кодировку по мере необходимости:

      header('Content-Type: text/html; charset=utf-8');

или

      header('Content-Type: text/html; charset=iso-8859-1');

или любую другую кодировку, которую вам нужно объявить.

Другие вопросы по тегам