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

301

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

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

Однако, когда я проверяю использование валидатора W3C, он приходит с:

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

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

Теги:
http-headers

6 ответов

865
Лучший ответ

Используйте header, чтобы изменить заголовок HTTP:

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

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

  • 4
    Я бы только добавил, что когда вы правильно устанавливаете HTTP-заголовок, вам больше не нужен <meta> .
  • 3
    @Jon: я бы использовал оба. HTTP-эквивалент META используется, когда HTML-документ не загружается по HTTP (например, с диска).
Показать ещё 4 комментария
29

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

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

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

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

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

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

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

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

10

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

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

См. RFC 2616, чтобы указать только кодировку.

  • 0
    Мне нравится эта опция, потому что (я предполагаю) она позволит вам установить другую часть типа контента отдельно (например, у вас есть несколько текстовых / простых страниц и несколько текстовых / html страниц, но все они UTF8.) Правильно ли мое понимание?
  • 1
    Я не могу найти часть RFC 2616, которая говорит, что это правильно, указывать этот путь. Content-Type = "Content-Type" ":" media-type и media-type = type "/" subtype *( ";" parameter )
Показать ещё 1 комментарий
7

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

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

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
  • 4
    Коалиция базы данных не влияет на вывод, сгенерированный PHP, потому что данные кодируются в собственном формате, настроенном для использования с PHP, прежде чем они когда-либо будут возвращены пользователю. Во-вторых, OP не упомянул, что использует MySQL. В-третьих, MyISAM устарел и его не следует рекомендовать, если вы не знаете, что делаете. Существует причина, по которой InnoDB стал новым значением по умолчанию.
  • 0
    /\ что он сказал.
Показать ещё 2 комментария
3

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

ini_set('default_charset', 'utf-8');
  • 0
    Это правильный ответ!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню