Проверка кодировки

Почему не приходит заголовок Content-Encoding?

AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/html

Когда запрашиваю txt файл с помощью https://webmaster.yandex.ua/server-response.xml , приходит вот такое:

Код статуса HTTP: «200 OK»
Время ответа сервера: 311мс
IP сайта: 31.170.164.134
Кодировка: UTF-8(unicode-1-1-utf-8, UTF8)
Размер страницы: 23.51Кб

Date: Sat, 14 Feb 2015 18:40:33 GMT
Server: Apache
Last-Modified: Fri, 13 Feb 2015 20:13:08 GMT
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: no-cache
Content-Length: 114
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

Когда же лезу на сайт через Firefox или Chrome, заголовки вот такие (взято из Хрома):

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:PHPSESSID=b41009fc0257aff276801119e5ee59c3; _ym_visorc_27969231=w
Host:audiophilesoft.com
If-Modified-Since:Fri, 13 Feb 2015 20:13:08 GMT
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36

HTTP/1.1 200 OK
Date: Sat, 14 Feb 2015 18:43:08 GMT
Server: Apache
Last-Modified: Sat, 14 Feb 2015 18:43:02 GMT
Accept-Ranges: bytes
Vary: Accept-Encoding
Cache-Control: no-cache
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain
Transfer-Encoding: chunked

Почему когда я запрашиваю файл или страницу через браузер, не приходит заголовок Content-Encoding: gzip? Получается, браузерам сервер отправляет несжатые данные? Но браузер же посылает Accept-Encoding.

Источник

Решение проблем неправильной кодировкой веб-страницы

При неправильной кодировке весь сайт или его часть отображаются в виде «кряпозяблов», т.е. непонятных символов, делающих текст нечитаемым. Такая ситуация может возникнуть при неверной настройке кодировки веб-сервера или при отсутствии настроек. Рассмотрим возможные варианты и способы устранения проблем

Неправильная кодировка HTML страниц

sudo gedit /var/www/html/encoding.html

Скопируем в него следующий HTML код, в котором отсутствует указание кодировки и посмотрим, какие проблемы могут с ним возникнуть и как их решить:

    

Тестовый файл для проверки кодировки

Как можно видеть, кодировка браузером определена неправильно:

Имеется несколько способов исправить эту ситуацию. Начнём с самого простого – явно указать кодировку для веб-страницы. Это делается метатегом, который должен быть расположен внутри тэга head:

Добавим эту строку к нашему тестовому файлику, чтобы получилось так:

    

Тестовый файл для проверки кодировки

Как мы можем убедиться на следующем скриншоте, проблема решена:

Если кодировка вашего файла отличается от UTF-8, то вместо неё поставьте windows-1251 или ту, которая соответствует кодировке веб-страницы. Чтобы научиться определять кодировку файлов, посмотрите эту инструкцию.

Это был самый простой способ исправления проблемы с кодировкой – без изменения настроек сервера.

Вернём наш тестовый файл в исходное состояние и продолжим изучение способов указания кодировки.

Если файлы .htaccess включены настройками Apache, то эти файлы можно использовать чтобы указывать кодировку отправляемых веб-сервером страниц. Чтобы включить поддержку файлов .htaccess в конфигурационном файле Apache ( /etc/apache2/apache2.conf ) найдите группу строк

 Options Indexes FollowSymLinks AllowOverride None Require all granted 

После этого сервер нужно перезапустить.

sudo systemctl restart apache2.service

Файл .htaccess должен быть размещён в той же директории, что и сайт. Мой сайт размещён в корневой директории веб-сервера. Если у вас также, то теперь в папке /var/www/html/ создайте файл .htaccess и добавьте в него директиву AddDefaultCharset после которой укажите желаемую кодировку. Примеры

AddDefaultCharset windows-1251

Можно указать кодировку, которая будет применена только к файлам определённого формата:

AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Набор файлов может быть любым, например:

AddCharset utf-8 .html .css .php .txt .js

Следующий вариант является альтернативным и также позволяет устанавливать кодировку для файлов определённого типа, для него нужно, чтобы был включён mod_headers:

 Header set Content-Type "text/html; charset=utf-8" 

Ещё один вариант, который также можно использовать в файле .htaccess для установки кодировки UTF-8:

Если сайт на PHP, то дополнительно может понадобиться продублировать кодировку с php_value default_charset:

AddDefaultCharset windows-1251 php_value default_charset "cp1251"

Можно вместо создания файла .htaccess установить кодировку в конфигурационном файле веб-сервера. Для Apache CentOS/Fedora это файл httpd.conf, а на Debian/Ubuntu это файл apache2.conf. Добавьте следующую строку для установки кодировки и перезапустите веб-сервер, чтобы изменения вступили в силу:

Как установить UTF-8 кодировку в PHP

В PHP скрипте для установки кодировки используется header, например:

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

Обычно вместе с кодировкой также указывают тип содержимого (в примере вариант для HTML страницы):

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

Ещё один вариант для RSS ленты:

header('Content-type: text/xml; charset=utf-8');

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

Описанный способ работает только когда PHP скрипт полностью генерирует содержимое страницы. Статические страницы (такие как html) вы должны сохранять в кодировке utf-8. Большинство веб серверов обратят внимание на кодировку файла и добавят соответствующий заголовок. На самом деле, сохранение PHP файла в кодировке utf-8 приведёт к такому же результату.

Неправильная кодировка результатов из базы данных MySQL

Если ваш сайт состоит из статической части (шаблон) и динамической, которая формируется из данных, получаемых из базы данных, то может возникнуть ситуация, когда часть сайта имеет правильную кодировку, а другая часть сайта имеет неправильную. В этом случае бесполезно менять настройки веб-сервера – поскольку всё равно часть страницы будет иметь неправильную кодировку.

Нужно начать с определения кодировки ваших таблиц. Можно посмотреть в phpMyAdmin:

Обратите внимание на столбец «Сравнение», запись «utf8_unicode_ci» означает, что используется кодировка UTF-8.

Можно подключиться к СУБД MySQL и проверить кодировку таблиц без phpMyAdmin. Для этого:

Если вы забыли имя базы данных, то выполните команду:

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

Если вы забыли имя таблиц, выполните:

Далее выполните команду, в которой имя_таблицы замените на настоящее имя таблицы:

SHOW FULL COLUMNS FROM имя_таблицы;
SHOW FULL COLUMNS FROM GLOBAL_STATUS;

Вы увидите примерно следующее:

Смотрите столбец Collation. В моём случае там utf8_general_ci, это, как и utf8_unicode_ci, кодировка UTF-8. Кстати, если вы не знаете в чём разница между кодировками utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ci, а также какую кодировку выбрать для базы данных MySQL, то посмотрите эту статью.

Теперь, когда мы узнали кодировку (в моём случае это UTF-8), то при каждом подключении к СУБД MySQL нужно выполнять последовательно запросы:

SET NAMES UTF8 SET CHARACTER SET UTF8 SET character_set_client = UTF8 SET character_set_connection = UTF8 SET character_set_results = UTF8

В PHP это можно сделать примерно так:

$this->mysqli = new mysqli($server, $username, $password, $basename); if ($this->mysqli->connect_error) < $this->errorHandler_c->logError(1, 'Connect Error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error, $_SERVER ['REQUEST_URI']); > $this->mysqli->query("SET NAMES UTF8"); $this->mysqli->query("SET CHARACTER SET UTF8"); $this->mysqli->query("SET character_set_client = UTF8"); $this->mysqli->query("SET character_set_connection = UTF8"); $this->mysqli->query("SET character_set_results = UTF8");

Обратите внимание, что UTF8 вам нужно заменить на ту кодировку, которая используется для ваших таблиц.

Изменение кодировки файлов

Если вы решили пойти другим путём и вместо установки новой кодировки изменить кодировку ваших файлов, то посмотрите статью «Как конвертировать файлы в кодировку UTF-8 в Linux». В ней рассказано, как узнать текущую кодировку файлов и как конвертировать файлы в любую кодировку (не только UTF-8).

Как узнать, какую кодировку отправляет сервер

Если вы хотите узнать, какие настройки кодировки имеет веб-сервер (какую кодировку передаёт в заголовках), то воспользуйтесь следующей командой:

curl URL -s -o /dev/null -D /dev/stdout | grep -E 'charset'

В ней вместо URL вставьте реальный адрес проверяемого сайта. Если сайт использует HTTPS, то укажите адрес сайта вместе с протоколом, например

curl https://softocracy.ru -s -o /dev/null -D /dev/stdout | grep -E 'charset'

Какую кодировку выбрать для веб-сайта

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

Связанные статьи:

Рекомендуемые статьи:

4 Комментарии

Здравствуйте Кажется сервер у хостера сам меняет кодировку. Все файлы юникод база юникод_дженерал_си, кодировка прописана и в хидере и в акцессе На локале всё нормально — тексты (Şərg döyüşlər и другие) отражаются нормально, но у хостера нормально ТОЛЬКО при первой загрузке страницы, а дальше идёт так — ??rg d�y�?l?r. Через фтп гружу в нотпад, а там кодировка АНСИ. Думал проблема в автоопределении кодировок нотпада — отключил эту опцию, файлы начали снова открываться в утф, но на сервере ничего не изменилось. Хостер пока бесплатный, сайт просто тестируются

curl 'https://8km-az.000webhostapp.com/cat.html?id=4' -s -o /dev/null -D /dev/stdout | grep -E 'charset'
content-type: text/html; charset=utf-8
  • ??rg d�y�?l?r

Если строки для этих тегов берутся из базы данных, проблема в PHP скрипте, который делает запрос. Как вы сказали, данные в базе данных в кодировке UTF, но PHP скрипт обрабатывает их как другую кодировку, в результате на выходе получается тарабарщика.

Найдите на этой странице пример после строки «В PHP это можно сделать примерно так:» — эти запросы нужно выполнять перед основным запросом к базе данных. Я сам пользуюсь именно таким способом.

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

Спасибо! Вот это помогло: в файле .htaccess для установки кодировки AddDefaultCharset windows-1251 php_value default_charset «cp1251»

Источник

Читайте также:  Java управление базами данных
Оцените статью