PHP:Текущая кодировка, используемая для отправки данных в браузер
-
02-07-2019 - |
Вопрос
Как я могу узнать, какая кодировка будет использоваться PHP при отправке данных в браузер?То есть.например, с заголовком типа Cotent:iso-8859-1.
Решение
Обычно серверы веб-хостингов Apache + PHP настроены на отправку НЕТ charset
заголовок.Это самый короткий способ проверить, как настроен ваш сервер:
- Использование этот инструмент позволяет увидеть заголовок сервера разместив любую из ваших страниц на вашем веб-сайте.Если в заголовках сервера вы видите
charset
это означает, что ваш сервер использует его, обычно он не будет содержатьcharset
. - Другой способ - запустить этот простой скрипт на вашем сервере:
<?php echo ini_get('default_charset'); ?>
Как было сказано выше, это обычно выводит пустую строку, если она отличается, она покажет вамcharset
из PHP.
2-е решение предполагает, что Apache не настроен с AddDefaultCharset some_charset
обычно это не так, но в таком случае, я боюсь, что настройки Apache могут переопределить директиву PHP deafult_charset ini.
Другие советы
Вы можете использовать решение header(), предложенное Уильямом, однако, если вы используете Apache, а конфигурация Apache использует кодировку по умолчанию, которая будет выигрывать каждый раз (Internet Explorer сойдет с ума) См.: AddDefaultCharset Добавить значение по умолчанию
Имейте в виду, что типы контента и кодировки - это две разные вещи.text/html - это тип содержимого;ISO-8859-1 и UTF-8 являются кодировками.
Заголовок HTTP-ответа, который отправляет сервер, обычно выглядит следующим образом:
Content-Type: text/html; charset=utf-8
"charset" - это на самом деле кодировка символов.Это не в отдельном заголовке;однако существует заголовок под названием "Content-Encoding", который фактически указывает, какой тип сжатия использует ответ (напримерgzip).
Если вы хотите изменить кодировку символов на UTF-8 в файле, содержащем HTML:
<?
header("Content-Type: text/html; charset=utf-8");
Вы можете установить свой собственный с помощью header('Content-type: xxx/yyy');
, но я считаю, что текст / html отправляется по умолчанию.
AFAIK, PHP отправляет строки по очереди.то есть, если ваши переменные содержат UTF-8, он отправит UTF-8.если у вас есть iso-8859-1, он отправит и это тоже.если вы их смешаете, получится некрасиво.
Если ваш сервер не настроен на использование содержимого по умолчанию или кодировки, а также PHP, PHP отправит только Content-Type: text/html
- он вообще не будет указывать кодировку и будет отправлять байты такими, какими он их видит в скрипте.
Если браузер получает страницу без указанной кодировки, могут произойти различные вещи:
- в большинстве браузеров есть меню "Кодировка / кодировка";если пользователь явно выберет один из них, браузер попытается применить его.Это случается не слишком часто, так что:
- некоторые браузеры пытаются отобразить его с кодировкой по умолчанию (которая зависит от локали, напримердля FF и cs_CZ раньше это было
iso-8859-2
;YMMV) - IE попытается определить кодировку эвристически (потребуется предположение, основанное на распределении символов - и много раз оно будет правильным;иногда он ошибается, и вы получаете страницу на румынском языке, интерпретируемую как китайский текст, что обычно означает "нечитаемый")
- некоторые старые браузеры вернутся к
us-ascii
Если с помощью этой процедуры кодировка PHP-скрипта и браузера совпадет, текст - случайно - станет читабельным.Если нет, то будут наблюдаться странные знаки и подобные явления.