Кодировки сайта: проблемы, вопросы, решения
От автора: вопрос кодировок является, без сомнения, одним из актуальных вопросов рано или поздно встающим перед любым веб-мастером. Практически каждый из нас сталкивался с такой, порой довольно неприятной, проблемой, как проблема корректного отображения информации на сайте, т.е. вывод ее на экран в нужной нам кодировке. Несмотря на то, что этот вопрос почти всегда решается очень легко, и ничего сложного в нем нет. Сейчас в сети можно часто увидеть вопросы о всевозможных «кракозябрах, вопросах и ромбиках» на сайте.
1. Кодировка при работе без использования баз данных
Забегая вперед, давайте сразу сформулируем основной тезис, придерживаясь которого мы значительно облегчим себе работу:
Кодировка в Вашем проекте должна быть универсальной.
Какое значение вкладывается в этот термин — «универсальная»? Это значит, что все составляющие создаваемого проекта, которые так или иначе касаются кодировок, должны иметь единую кодировку. Чтобы понять эту мысль разобьем сформулированный тезис на пункты, которые затем поэтапно разберем:
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
1. Содержимое всех файлов должно иметь единую кодировку.
2. Заголовки должны передавать единую кодировку.
3. В качестве кодировки сервера необходимо установить единую кодировку.
4. Кодировка соединения с БД также не должна отличаться от кодировки создаваемого проекта.
Это 4 основных правила, которые и являются составляющими сформулированного тезиса. Давайте теперь разберем каждый из этих пунктов.
Итак, на сервере создадим файл index.php, содержимое которого сохраним в кириллической кодировке. Сделать это можно, например, в редакторе Notepad++ через пункт меню Кодировки.
Узнать текущую кодировку файла можно взглянув в строку состояния редактора (в нижней панели).
Здесь уместно дать небольшой совет. При создании сайтов лучше пользоваться одной из двух кодировок: кириллической (windows-1251) или юникод без сигнатуры BOM (utf-8 without BOM). При этом следует знать, что юникод более универсален. Эта кодировка содержит большее количество символов, а потому идеально подойдет для мультиязычных сайтов, в то время как с кириллической кодировкой здесь могут возникнуть проблемы. Есть еще ряд нюансов при использовании юникода. В общем, лучше использовать ту кодировку, которая более универсальна, но если Ваш сайт содержит только кириллические символы, то никто не запрещает использовать Вам windows-1251, тем более, что она также имеет свои плюсы (детальнее об этом, возможно, в одном из следующих уроков).
Отлично, кодировка нашего файла кириллическая (windows-1251). У всех остальных файлов проекта, согласно первому пункту, кодировка должна быть аналогичной. В мета-тегах (между тегами head) также укажем эту кодировку:
Выведем какой-нибудь текст кириллицей на страницу:
Сохраним файл и попробуем открыть его в браузере… На экран выводится нечитабельная строка — набор вопросительных знаков вместо букв.
Почему так? Ведь мы сохранили файл в кириллической кодировке, в мета-теге также прописали нужную кодировку, но это не помогло. Если мы взглянем, в какой именно кодировке браузер отобразил нам текст, то увидим UTF-8.
При этом если мы выставим в браузере вручную нужную нам кодировку, то текст станет читабельным, но… до следующего обновления страницы в браузере. Еще раз зададимся вопросом, почему так произошло? Почему браузер никак не отреагировал на кодировку указанную в мета-теге?
«Виноват» здесь не браузер, а сервер. Дело в том, что сервер отсылает в браузер так называемые заголовки, где указывается кодировка, в которой браузер должен отобразить содержимое файла. В качестве кодировки сервер берет кодировку по умолчанию, т.е. так называемую дефолтную кодировку сервера. Посмотреть дефолтную кодировку сервера можно в конфигурационном файле httpd.conf, расположенном на сервере в каталоге usr\local\apache\conf\. Здесь кодировка задается в строке AddDefaultCharset. Здесь же мы можем изменить кодировку на нужную нам, при этом не забывая после внесения изменений перезапускать сервер.
Но изменить кодировку получится только на локальном сервере. На сервере в сети хостер нам просто не даст доступ к конфигурационному файлу сервера… и правильно сделает 🙂 Что же нам делать в таком случае? Неужели придется подстраиваться под настройки сервера? Конечно же нет. Для решения этой задачи существует 2 варианта, отвечающих за второй и третий сформулированные нами выше пункты.
Согласно второму пункту мы можем самостоятельно передать в заголовках необходимую кодировку. Делается это при помощи функции header(), в параметрах которой мы укажем тип документа и, собственно, кодировку. В самом верху файла (перед объявлением доктайпа (типа документа)) добавим строку кода:
Кодировка windows 1251 в сайтостроении
Кодировка windows 1251 была создана в начале 90 годов для русификации программных продуктов, выпускаемых корпорацией Microsoft :
Кодировка является 8-битной и включает в себя символы славянской группы языков, в которую входят русский, белорусский, украинский, болгарский, македонский, сербский – это дает преимущество перед остальными кириллическими кодировками ( ISO 8859-5, KOI8-R, CP866 ). Однако у 1251-кодировки имеются и весомые недостатки:
Ниже приведены символы из Code Page 1251 или сокращенно СР1251 ( числа под символами являются кодом в шестнадцатеричной системе такого же символа в Юникоде ):
Кодировка windows 1251 в html
Нередко у web-разработчиков и блогеров, обладающих различной квалификацией возникает проблема с кодировкой страниц: вместо подготовленного текста появляются неизвестные, нечитаемые символы. Чтобы разобраться с данной проблемой, необходимо понимать суть термина « кодировка страницы ».
Текст в памяти компьютера хранится в виде определенного количества байт, а не в том виде, в котором он отображается в текстовом редакторе. Каждый байт является кодом, который соответствует одному символу. Для того чтобы текст на странице отображался как следует, нужно сообщить браузеру, какую таблицу кодов для расшифровки и отображения он должен использовать.
Таблица кодировок не является универсальной, то есть, для расшифровки текста необходимо использовать ту, которая соответствует кодировке символов:
Для того чтобы html-документ корректно отобразился в браузере, необходимо указать используемую кодировку. Делается это следующим образом:
— между тегом
и закрывающим его нужно прописать — исходя из этой строки, браузер будет использовать символы русского алфавита для отображения текста на странице.Кодировка windows 1251 в PHP
Ни для кого не является тайной, что генерация страниц проходит путем выборки и использования какой-то части информации, которая хранится в базе данных. При написании сайта на PHP , чаще всего это mysql :
Нередко при смене хостинга возникает проблема: различные кодировки информации в базе данных и в шаблонах страниц. Из-за этого одна сгенерированная страница может одновременно содержать несколько кодировок. Если информация на сайте представлена в кодировке виндовс 1251 , то и чтение из базы данных должно осуществляться с помощью таблицы, в которой представлена win 1251 кодировка.
Для согласования расшифровки необходимо выполнить функцию mysql_query(«SET NAMES cp1251») – это означает, что преобразование из машинного кода будет осуществляться согласно таблице cp1251 .
Кодировка windows 1251 в htaccess
При создании сайта, предварительно настроив кодировки в шаблонах и базах данных, все равно может всплыть проблема некорректного отображения информации в браузере.
Для того чтобы для веб-ресурса была задана кодировка виндовс-1251 , необходимо найти ( или создать ) файл .htaccess . Это файл, который хранит в себе дополнительные настройки и описания конфигураций web-сервера.
В нем для установки кодировки следует прописать следующие строки:
- DefaultLanguage ru;
- AddDefaultCharset windows-1251;
- php_value default_charset «cp1251».
Таким образом, для корректного отображения текста должны совпадать его кодировка и таблица кодов, с помощью которой браузер будет расшифровывать символы. Для текстов, написанных на славянских языках, необходима win 1251 кодировка. Важно помнить, что элементы страниц и баз данных должны быть описаны с помощью одной таблицы кодов.
Head php windows 1251
Вот затеял делать чат(нашел в инете) работает все нормально но имя пользователя отображается некоректно(квадратики) вот код.
файл index.php
//Simple exit message
$fp = fopen ( «log.html» , ‘a’ );
fwrite ( $fp , «User » . $_SESSION [ ‘name’ ] . » has left the chat session. » );
fclose ( $fp );
session_destroy ();
header ( «Location: index.php» ); //Redirect the user
>
//Load the file containing the chat log
function loadLog() <
var oldscrollHeight = $(«#chatbox»).attr(«scrollHeight») — 20;
$.ajax( <
url: «log.html»,
cache: false,
success: function(html) <
$(«#chatbox»).html(html); //Insert chat log into the #chatbox div
var newscrollHeight = $(«#chatbox»).attr(«scrollHeight») — 20;
if(newscrollHeight > oldscrollHeight) <
$(«#chatbox»).animate(< scrollTop: newscrollHeight >, ‘normal’); //Autoscroll to bottom of div
>
>,
>);
>
setInterval (loadLog, 2500); //Reload file every 2.5 seconds
session_start ();
if(isset( $_SESSION [ ‘name’ ])) <
$text = $_POST [ ‘text’ ];
?>
$fp = fopen ( «log.html» , ‘a’ );
fwrite ( $fp , «(» . date ( «g:i A» ). «) » . $_SESSION [ ‘name’ ]. «: » . stripslashes ( htmlspecialchars ( $text )). » » );
fclose ( $fp );
>
?>
Есть три способа отвечать на вопросы: сказать необходимое, отвечать с приветливостью и – наговорить лишнего
Плутарх — (ок. 46 — ок.120) — древнегреческий писатель, историк
PHP HEADER КОДИРОВКА 1251
Кодировка 1251 является одной из наиболее распространенных в России и странах бывшего СССР. Она используется для отображения текста на русском языке, украинском языке и других языках, использующих кириллицу. Для того, чтобы указать серверу, что нужно использовать именно эту кодировку при отправке ответа на запрос, в PHP используется функция header().
header(‘Content-Type: text/html; charset=windows-1251’);
echo ‘Текст на русском языке’;
В данном примере мы указываем, что тип содержимого, который будет отправлен на страницу, является текст/html, а кодировка — windows-1251. Затем выводим текст на русском языке с помощью команды echo().
Если необходимо изменить кодировку страницы внутри уже открытого документа, можно использовать следующий код:
header(‘Content-Type: text/html; charset=windows-1251’);
header(‘Content-Language: ru’);
echo ‘ Заголовок страницы . ‘;
В этом примере мы указываем кодировку и язык страницы с помощью двух header-заголовков, а затем выводим HTML-код с помощью команды echo().
Недостатки PHP-Fusion. Если сайт вопросительными знаками сделать кодировку cp1251
Кодировки ANSI, UTF-8 и Unicode — Чем отличаются?
HTML : Charset UTF-8 and php header() not working
UTF-8 и mbstring в PHP — Базовый курс PHP-7
PHP : How to set HTTP header to UTF-8 using PHP which is valid in W3C validator
PHP 8.1.0-dev Backdoor Remote Code Execution — RCE — PoC — FLAST101