Останні кілька годин я провів на своєму веб-сайті, щоб перевірити HTML 4.01 Strict, і я насправді досяг успіху в цьому, але є ще одне попередження, якого я не можу позбутися. Попередження:
Невідповідність кодування символів!
Кодування символів, зазначене в заголовку HTTP (iso-8859-1) відрізняється від значення в елемент (utf-8). Я використовуватиму значення з заголовка HTTP (iso-8859-1) для цього підтвердження.
Для отримання загальної інформації про те, як змінити заголовок набору символів у різних мережевих стеках, див. http://www.w3.org/International/O-HTTP-charset
2018-05-25 13:30
Сервер чітко маркує документ як ISO-8859-1 у заголовках HTTP. Спробуйте зберегти default.html за допомогою кодування UTF-8 за допомогою відповідного редактора.
2018-05-25 03:07
Добре, я вигадав часткове вирішення моєї проблеми. Оскільки це був лише файл default.html, який викликав попередження, я припустив, що сервер робить щось особливе для нього через його ім'я. Тому я створив новий файл home.html з тим самим вмістом, що й файл default.html, і вказав файл.htaccess на новий файл (див. Рядок 3 нижче).
# Use PHP5 as default AddHandler application/x-httpd-php5 .php DirectoryIndex home.html AddDefaultCharset UTF-8
Це вирішило проблему, і всі файли розпізнаються як UTF-8. Я все ще не впевнений, що сервер робить з файлом default.html або де налаштування щодо цього, але в міру того, як моя проблема пішла, я забуду про це.
При неправильному кодуванні весь сайт або його частина відображаються у вигляді «крязязяблів», тобто. незрозумілих символів, які роблять текст нечитаним. Така ситуація може виникнути при неправильному налаштуванні кодування веб-сервера або при відсутності налаштувань. Розглянемо можливі варіанти та способи усунення проблем
Неправильне кодування HTML сторінок
Створимо тестовий файлик:
Sudo gedit /var/www/html/encoding.html
Скопіюємо до нього:
Відкриємо цей файл у браузері
Як можна бачити, кодування браузером визначено неправильно:
Є кілька способів виправити цю ситуацію. Почнемо з найпростішого – явно вказати кодування для веб-сторінки. Це робиться метатегом, який має бути розташований усередині тега head:
Додамо цей рядок до нашого тестового файлика, щоб вийшло так:
Тестовий файл для перевірки кодування
Як ми можемо переконатися на наступному скріншоті, проблему вирішено:
Якщо кодування вашого файлу відрізняється від UTF-8, то замість неї поставте windows-1251або ту, яка відповідає коду веб-сторінки. Щоб навчитися визначати кодування файлів, перегляньте .
Це був найпростіший спосіб виправлення проблеми з кодуванням без зміни налаштувань сервера.
Повернемо наш тестовий файл у вихідний стан та продовжимо вивчення способів вказівки кодування.
Якщо файли .htaccessвключені налаштуваннями Apache, то ці файли можна використовувати щоб вказувати кодування сторінок, що відправляються веб-сервером. Щоб увімкнути підтримку файлів .htaccessу конфігураційному файлі Apache ( /etc/apache2/apache2.conf) знайдіть групу рядків
І в ній замініть
AllowOverride None
AllowOverride All
Після цього сервер потрібно перезапустити.
Sudo systemctl restart apache2.service
Файл .htaccessповинен бути розміщений у тій директорії, що і сайт. Мій сайт розміщений у кореневій директорії веб-сервера. Якщо у вас також, то тепер у папці /var/www/html/створіть файл .htaccessі додайте до нього директиву AddDefaultCharsetпісля якого вкажіть бажане кодування. Приклади
AddDefaultCharset UTF-8
AddDefaultCharset windows-1251
Можна вказати кодування, яке буде застосовано лише до файлів певного формату:
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
Набір файлів може бути будь-яким, наприклад:
AddCharset utf-8 .html .css .php .txt .js
Наступний варіант є альтернативним і дозволяє встановлювати кодування для файлів певного типу, для нього потрібно, щоб був включений mod_headers:
Ще один варіант, який також можна використовувати у файлі .htaccessдля встановлення кодування UTF-8:
IndexOptions +Charset=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. Додайте наступний рядок для встановлення кодування і перезапустіть веб-сервер, щоб зміни набули чинності:
AddDefaultCharset UTF-8
Як встановити 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. Для цього:
Mysql -u root -p
Якщо ви забули ім'я бази даних, виконайте команду:
SHOW DATABASES;
Припустимо, я хочу переглянути кодування для таблиць у базі даних information_schema
USE 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).
Як дізнатися, яке кодування надсилає сервер
Якщо ви хочете дізнатися, які параметри кодування має веб-сервер (яке кодування передає в заголовках), скористайтеся наступною командою:
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"
Яке кодування вибрати для веб-сайту
Для того, щоб сторінки вашого сайту відображалися коректно у всіх браузерах та на всіляких пристроях, потрібно подбати про встановлення правильного кодування. Недотримання деяких умов, про які ми сьогодні розповімо докладно, може призвести до того, що текст перетвориться на безглуздий набір символів, які просто неможливо прочитати (кракозябри).
Чому замість нормального тексту відображаються кракозябри
Кожна сторінка вашого сайту повинна мати певне кодування. Про те, яке кодування використовується в даний момент, необхідно повідомляти браузеру, передаючи спеціальні заголовки (header). У цих заголовках необхідно вказати кодування, яке відповідає тому, яке ви використовуєте в тілі документів, розміщених на сайті (на його сторінках).
Сучасні браузери можуть і самі визначити кодування документа, якщо вебмайстер забув вказати його у явному вигляді. Іноді трапляється так, що виникають нестикування між «думкою» браузера і реальністю, звідси і з'являється набір символів, які неможливо прочитати. Набір галимати може приймати різні види, іноді це будуть просто дивні символи, схожі на стародавні ієрогліфи, а іноді - просто питання або питання всередині чорних ромбиків. За великим рахунком не так важливо, які кракозябри відображає браузер, а важливо те, що людина їх прочитати не може.
Якщо ж ви зіткнулися з проблемою некоректно зазначеного кодування і бачите на своєму сайті те, що не в змозі прочитати, насамперед скористайтеся спеціальним Декодером, розробленим у студії Артемія Лебедєва. Для цього просто скопіюйте текст, який бажаєте розшифрувати, вставте його у спеціальне поле та натисніть «Розшифрувати». У разі успішного декодування, ви побачите текст, що вже читається, а також вихідне кодування і шлях, який довелося пройти програмі, щоб вивести результат.
Все це потрібно, скоріше, для просунутих користувачів, яким отримана інформація зможе чимось допомогти. Можливо, результат дій програми наштовхне вас на думку і зрозумієте, звідки на вашому сайті беруться кракозябри і швидко виправте ситуацію. А якщо ж виконані маніпуляції зовсім ні про що вам не говорять, то давайте просто рухатися далі.
Як правильно вибрати кодування
У рамках цієї статті ми не заглиблюватимемося в те, які кодування бувають і чим вони один від одного відрізняються, т.к. не хочемо перевантажувати ні себе, ні вас зайвою інформацією, та й з метою сьогоднішньої статті цього не було. Варто відзначити лише той факт, що на російськомовному сайті немає абсолютно ніякого сенсу встановлювати кодування windows-1251, вичерпно описане у чудовій статті Вікіпедії. Навіть якщо всі тексти на ньому будуть написані виключно російською та не буде ніяких вкраплень нестандартних символів. Натомість потрібно просто вибрати універсальне кодування UTF-8, прийнявши це як це, не забиваючи голову зайвою інформацією.
Справа в тому, що немає сенсу вибирати для свого сайту кодування, яке підтримує лише символи слов'янських мов, таких як російська, українська, білоруська, сербська, македонська і болгарська. Навіщо спочатку обмежувати себе та прирікати на можливі проблеми надалі. Що ви робитимете, якщо знадобиться вставити символ, якого немає у підтримуваних?
UTF-8 (від англ. Unicode Transformation Format) - восьмибітний формат перетворення Юнікоду, який одержав всесвітнє визнання і був стандартизований якраз для уникнення проблем, пов'язаних з появою кракозябрів і плутаниною з нечитабельними текстами. З чого можна сміливо зробити висновок, що в даному випадку з двох лих потрібно вибирати більшу і спати спокійно, не вникаючи в подробиці, тому що тут і так все зрозуміло. Подивіться розмір Юпітера і Венери для порівняння.
Основні способи встановлення правильного кодування
Досить часто проблеми з кодуванням сайту виникають не тому, що не було виконано жодної з умов, про які ми вам зараз розповімо, а достатньо не виконати лише одну з них, щоб текст на вашому сайті почав відображатися некоректно. Після того, як ви встановите кодування всіма перерахованими способами, завдання буде вирішено з ймовірністю 99.9%. До такого висновку ми дійшли на основі багаторічного досвіду роботи з сайтами на всіляких хостинг-майданчиках, з використанням різних систем адміністрування та налаштувань серверів.
Кодування в.htaccess - AddDefaultCharset
Перш за все, вам потрібно встановити кодування всіх сторінок сайту за замовчуванням за допомогою однієї дуже корисної директиви htaccess - AddDefaultCharset, яка в дослівному перекладі з англійської означає «Додати КодуванняЗа замовчуванням». Робиться це дуже просто:
AddDefaultCharset UTF-8
Якщо ви не знаєте, що таке , то просто створіть текстовий файл у блокноті, а потім за допомогою Total Commander-а перейменуйте його на файл без назви, що має розширення HTACCESS ( - саме так і має виглядати повне ім'я файлу). Після цього завантажте щойно створений файл до кореневої директорії вашого сайту (у те саме місце, де знаходиться головний виконуючий файл, наприклад index.php). І не забудьте вставити рядок із кодуванням за умовчанням, який ми щойно наводили.
Кодування за допомогою meta charset
Метатеги здатні відсилати браузеру інформацію про сторінку у вигляді спеціальних заголовків, одним з яких є той, що нам потрібен. charset. Взагалі метатеги можуть мати аж 4 різні атрибути:
- content;
- http-equiv;
- name;
- scheme.
Насправді, із представлених чотирьох атрибутів лише один є обов'язковим. contentале існують і винятки. Наприклад, у нашому випадку буде використовуватися скорочена версія запису і ми встановимо кодування за допомогою метатегу саме так:
Старий формат запису давно канув у Лету і використовувати його більше сенсу немає:
Як відомо, метатеги прийнято розміщувати усередині контейнера. head. Про це, мабуть, знають уже всі без винятку. Виконайте цю операцію і ми перейдемо до наступного пункту в нашому списку.
Кодування файлу за допомогою функції header PHP
Даний спосіб підійде лише тим, у кого сайт реалізований за допомогою найпопулярнішої на даний момент мови програмування, здебільшого орієнтованої на створення веб-сайтів - PHP (Hyper Text Preprocessor). Для вирішення задачі, поставленої в рамках цієї статті, ми скористаємося чудовою вбудованою функцією header() , призначеною для передачі заголовків, аналогічно метатегам, але з тією невеликою відмінністю, що дія виконується з PHP-скрипту, а не за допомогою HTML-коду.
Встановити кодування UTF-8 для файлу за допомогою функції header()досить просто - потрібно просто вставити наведений код на початок сторінки, але зрозуміло всередині області дії PHP, яка позначається так: здесь у нас PHP-код?>або ж так -.
Header("Content-type: text/html; charset=utf-8");
Найважливішим моментом тут є те, що заголовки ми маємо право передавати лише у тому випадку, якщо перед цим не було жодного висновку з боку скрипту. Саме тому ми вставляємо цей код на початок сторінки. Робити це потрібно з розумом і добре розуміти, що відбувається, адже ви можете бути впевнені, що вставляєте заголовок на початок файлу, але можете не знати, що цей файл використовується в іншому файлі, який підтягується за допомогою функції requireабо includeвже після того, як певну інформацію було виведено на екран. Тому якщо ви не дуже добре розумієте про що зараз йдеться, краще перейдіть до наступного кроку і поверніться до цього, якщо 3 попередні не допомогли встановити правильне кодування сторінок вашого сайту.
Збереження файлів у правильному кодуванні
Однією з, мабуть, найпоширеніших причин виникнення кракозябрів на сайті є некоректне кодування самих фалів, які використовуються для створення кінцевого документа. Найчастіше така проблема виникає у програмістів-початківців, які тільки роблять свої перші кроки в освоєнні мистецтва. Коли в якості движка сайту обрана одна з популярних на даний момент систем адміністрування, дана проблема може виникати в дуже рідкісних випадках, але якщо використовується, то трапляється так мало не в кожному третьому випадку.
Як ми домовилися раніше, використовуване нами кодування на всіх, навіть на самих пропалених російськомовних сайтах - UTF-8, тому і всі файли, що складають двигун сайту, ми з вами будемо кодувати в цьому ж форматі. А для того, щоб змінити кодування самого файлу, що закачується на сервер, звичайного блокнота, що надається операційною системою Windows, звичайно, не достатньо. Тому краще скористатися сторонньою програмою, що розповсюджується безкоштовно – Notepad++, яку можна завантажити на офіційному сайті без особливих проблем.
Успішно пройшовши нескладний процес установки, ви повинні будете призначити цю програму редактором за замовчуванням, зробити деякі налаштування на свій смак і поміняти кодування файлу, що некоректно відображається так само, як показано на скріншоті. Тобто. Вам потрібно вибрати значення «Кодувати в UTF-8 (без BOM)». Хорошою ознакою того, що причина була саме в цьому, буде те, що спочатку не буде обрано жодного з варіантів і вам буде запропоновано «Перетворити на UTF-8 (без BOM)». Якщо ви це побачили, будьте впевнені, що до вирішення проблеми з кодуванням залишилися лічені секунди.
На додачу хочеться сказати лише те, що вибирати потрібно саме без BOM. В іншому випадку, якщо кодувати просто в UTF-8 (з BOM), то на початку файлу будуть створюватися зайві байти. BOM - Byte Order Mark намагаються не використовувати саме в Інтернеті під час кодування у форматі UTF-8, т.к. це призводить до помилок через створення перешкод коректної PHP-інтерпретації.
Ну а тепер, коли всі необхідні дії виконані, ви, швидше за все, на сторінках вашого сайту побачите перед собою текст, що легко читається, і зітхнете вільно 🙂
Однією з найчастіших проблем, з якою стикається початківець Web-майстер(та й не тільки початківці), це проблеми з кодуванням на сайті. Навіть у мене постійно з'являється під час створення сайтів " абракадабраАле, добре, я чудово знаю, як цю проблему вирішити, тому все наводжу в порядок протягом декількох секунд. І в цій статті я постараюся навчити Вас також швидко вирішувати проблеми, пов'язані з кодуванням на сайті.
Перше, що варто відзначити, це те, що всі проблеми з появою "Абракадабри" пов'язані з розбіжністю кодування документа і кодування, що виставляється браузером. Припустимо, документ у windows-1251, а браузер чомусь виставляє UTF-8. А вже джерелом такої розбіжності можуть бути такі причини.
Перша причина
Неправильно прописаний мета-тег content-type. Будьте уважні, в ньому завжди має бути те кодування, в якому написаний Ваш документ.
Друга причина
Начебто мета-тег прописаний так, як Ви хочете, і браузер виставляє саме те, що Ви хочете, але чомусь все одно з кодуванням проблеми. Тут, майже напевно, винне те, що сам документ має чудове кодування. Якщо Ви працюєте в Notepad++, то внизу справа є назва кодування поточного документа (наприклад, ANSI). Якщо Ви ставите у мета-тезі UTF-8, а сам документ написаний у ANSI, то зробіть перетворення на UTF-8(через меню " Кодуванняі пункт Перетворити на UTF-8 без BOM").
Третя причина
Четверта причина
І, нарешті, остання популярна причина – це проблема з кодуванням у базі даних. По-перше, переконайтеся, що всі Ваші таблиці та поля написані в одному кодуванні, яке збігається з кодуванням решти сайту. Якщо це не допомогло, то відразу після підключення у скрипті виконайте наступний запит:
SET NAMES "utf8"
Замість " utf8може стояти інше кодування. Після цього всі дані з бази повинні виходити в правильному кодуванні.
У цій статті я, сподіваюся, розібрав, як мінімум, 90% проблем, пов'язаних з появою "Абракадабри" на сайті. Тепер Ви повинні розправлятися з такою популярною і простою проблемою, як неправильне кодування, за два рахунки.
15.03.2016
Поки немає
Всім привіт!
Продовжуємо вивчати основи HTML. У цьому уроці ми розберемо, як вказати HTML кодуваннядля веб-сайту (веб-сторінки).
Цей урок дуже важливий, оскільки незнання того, як вказати кодування для веб-сторінки, може призвести до того, що вашу сторінку не зможуть прочитати. Ви запитаєте: "Це як так, не зможуть?".
Давайте я покажу, як виглядає мій блог із неправильним кодуванням:
Отже, HTML кодування– це таблиці відповідності кодів та символів алфавіту. Тобто, наш комп'ютер із кодуванням поміняє код на зрозумілі читальні літери.
Щоб повідомити браузеру, в якому кодуванні знаходяться символи веб-сторінки, потрібно прописати між тегами
ось такий мета тег:
Зверніть увагу, що в коді є слово «ім'я кодування». Тут необхідно вказати HTML кодування.
Зазвичай це utf-8 або windows-1251.
Кодування дляutf-8:
Кодуваннядля windows-1251:
Якщо забути вказати браузеру, в якому кодуванні сайт або веб-сторінка, то браузер спробує визначити кодування автоматично, але не завжди це виходить правильно. В результаті результат буде такий, який я показав на зображенні вище.
Переходимо до практики.
Як створити HTML документ з
кодуванням utf-8
"Всі програми" => "Стандартні" => "Блокнот" :
ось цей мета-тег:
Тисніть у блокноті "Файл" => "Збереже як ...":
Там, де пункт «Кодування:» вкажіть UTF-8 .
Натисніть «Зберегти»:
Збільшити зображення?
Як створити HTML документ із кодуванням windows-1251
Відкрийте стандартний блокнот. "Всі програми" => "Стандартні" => "Блокнот"
.
Далі вставляєте в блокнот стандартний код HTML:
Тепер вказуємо, у якому кодуванні збережено веб-сторінку. Для цього розмістіть між тегами
ось цей мета-тег:
Ось так має вийти (рядок №4):
Тисніть у блокноті "Файл" => "Збереже як ...":
Там, де пункт «Ім'я файлу» напишіть назву веб-сторінки на латиниці та з розширенням «.html». Я гадаю, ви пам'ятаєте це ще з перших уроків.
Там, де пункт "Кодування:" вкажіть "ANSI" .
Натисніть «Зберегти»:
От і все!
Більшість вебмайстрів вибирають кодування UTF-8. Причини говорити не буду, тому що боюся навантажити вас інформацією, яка на вашому етапі пізнання HTML ще не потрібна.
Для прикладу в блокноті встановіть код:
І вкажіть при збереженні «ANSI»:
Так як це неправильно, результат буде таким:
Зберігайте правильно ваші веб-сторінки, щоб уникнути таких результатів
Попередній запис
Наступний запис