Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Здравствуй уважаемый читатель блога LifeExample, кодировка веб страницы это очень интересный зверь, и за частую хищный для начинающих веб мастеров. Я уверен в том, что все новички сталкиваются с проблемой правильного отображения текста на страницах своего сайта. Ты дорогой читатель, наверное встречал в сети интернета ресурсы, на страницах которых отображался не читаемый текст, а кракозябры.
Кракозябрами в среде программирования веб сайтов принято называть символы не соответствующие тем, которые должны быть выведены на страницу. Например, на созданной вами странице должно отображаться приветствие: «Здравствуй читатель моего блога!», а на деле получаете непонятный набор закорючек «Р—РґСЂР°РІСЃС‚РІСѓР№ читатеРСЊ моего Р±РРѕРіР°!» – вот такие закорючки и есть злые КРАКОЗЯБРЫ.
В данной статье мы разберем эту проблему с ног до головы, чтобы больше не возвращаться к танцам с бубном вокруг нечитаемого текста.
И так, чтобы понять откуда появляются подобного рода иероглифы, нам нужно познакомиться с понятием кодировка страницы. Любой текст на компьютере представляется в виде набора байтов, в каждом из этих байтов определенным кодом — закодирован только один единственный символ. Так вот для того чтобы правильно расшифровать или раскодировать набор байтов и представить его в понятном человеку виде, браузеру нужно провести соответствие с одной из кодовых таблиц. Базовой кодировкой является ASCII кодировка, она содержит в себе коды 128 символов латинского алфавита и спец символов вроде скобок и решеток. Именно из ASCII появились первые русскосимвольные кодировки CP866 и KOI8-R, а из них вышла известная сегодняшним вебмастерам кодировка windows-1251. Не смотря на то, что все эти кодировки призваны для отображения русского текста, они все отличаются друг от друга кодами для одинаковых символов. Если текст писался в кодировке CP866, а браузер пытается раскодировать ее с помощью таблицы кодов windows-1251, то в результате мы получим не читаемые слова. Такое часто происходит при отправке сообщений через почтовый сервер.
Приведенные здесь названия кодировок далеко не все что существуют и используются в разных случаях, их намного больше чем вы думаете. С таким обилием кодовых таблиц образовалась проблема совместимости кодировок, и веб мастерам пришлось вставть на борьду с универсализацией кода, что занимало много времени и нервов. На сегодняшний день изобретена панацея для данной проблемы в виде универсальной кодировки utf-8, со временем она вытесняет используемые ранее кодовые таблицы символов, и сейчас уже не для кого не встает вопрос о том в какой кодировке лучше сохранять данные.
Много было сказано относительно эволюции кодировок, и постановке самой задачи, пришло время поговорить о практических моментах.
Существует четыре места на кухне программирования сайта, которые требуют соблюдения единого стандатра кодирования текста.
- Кодировки скриптов.
- Кодировка таблиц MySQL.
- Кодировка самой HTML страницы.
- Локаль используемая браузером пользователя.
Во всех этих составляющих сайта, должна использоваться единая кодировка, какая – решать вам, но я рекомендую utf-8, всетаки она универсальная)
И так теперь подробнее рассмотрим, что нужно сделать для того, чтобы привести к одной кодировке всеперечисленые составляющие.
Кодировки скриптов (шаг 1)
Для того чтобы все скрипты имели одну кодировку, нужно при создании нового скрипта указать желаемую кодировку в настройках вашего редактора. Приведу пример данной процедуры в NotePad++ . При создании нового PHP файла сразу идем в раздел Encoding, он находится в меню, и выбираем Convert to UTF-8 without BOM.
Выбираем именно Convert to UTF-8 without BOM, а не просто Convert to UTF‑8. Приставка without BOM означает то что в первых двух байтах файла будет зашифрована специальная информация о параметре кодировки, в скриптах нам не нужна никакая лишняя информация. В большенстве случаев сохранение с BOM не окажется криминальным, но когданить один из скриптов откажется правильно работать и одной из причин может отазаться именно информация заключенная в первых байтах файла.
Кодировка таблиц MySQL. (шаг 2)
Для того, чтобы узнать какие кодировки используются в ваше MySQL базе, воспользуемся интерфейсом phpMyAdmin. В разделе SQL напишем запрос:
|
1 |
SHOW VARIABLES LIKE ‘char%’; |
Выглядеть это должно вот так:
Жмем ОК и получаем информацию о кодировках таблицы
Значения на против character_set_client и character_set_results должны совпадать, так как эти параметры отвечают за кодировку, в которой данные поступают в базу и за кодировку в которой данные берутся из базы.
Если они у вас различаются, то нужно в PHP коде в ручную установить нужную кодировку. Делается это вот такой строчкой:
|
1 |
mysql_query(‘SET names «utf8″‘); |
После этого три переменные character_set_client, character_set_connection и character_set_results примут значение utf8.
Подробнее о том как с помощью PHP работать с базой данных можно прочесть в статье PHP работа с базой данных (Часть 1-3).
Кодировка самой HTML страницы. (Шаг 3)
Теперь данные взятые с базы и данные обрабатываемые в php скрипте, будут совпадать по кодировке, и выводиться в понятном для человека тексте. Но это еще не все, нужно указать кодировку в разделе для мета тегов:
|
1 |
<meta http-equiv=«Content-Type» content=«text/html; charset=utf-8»> |
Либо в cкрипте настроек php командой:
|
1 |
header(‘Content-Type: text/html; charset= utf-8’); |
Если кодировка HTML будет задана сразу двумя способами, то приоритетным будет задание кодировки из php скрипта.
Также можно глобально задать правило кодировки HTML в файле .htaccess добавив в него строку:
|
1 |
AddDefaultCharset UTF—8 |
Локаль используемая браузером пользователя. (Шаг 4)
Еще одна важная деталь при корректном отображении текста это установка локали:
|
1 |
// Кодировка UTF-8 |
При установки такой локали, пердставители других стран использующие другую кодовую страницу в своей операционной системе, будут видеть русский текст.
Мы рассмотрели основные моменты возникновения противоречий в кодировках веб страницы, подведем итоги. Для того чтобы ваш рускоязычный сайт был всегда доступен для чтения, необходимо прописать в PHP скрипте настроек такие строки:
|
1 |
<?php |
Если у тебя дорогой читатель остались вопросы по данной статье о PHP кодировке страниц, то смело задавай их в комментариях.
Читайте также похожие статьи:
![]()
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Когда я только начинал изучать тему разработки сайтов, кракозябры были одной из моих постоянных проблем. Создал HTML-страницу — в браузере кракозябры, установил денвер и попробовал создать сайт на PHP — снова вместо букв кракозябры. Скачал иностранную тему, подключился к базе данных — та же проблема.
На своих сайтах я обычно использую UTF-8 (это такая кодировка текста, она ещё называется юникод), соответственно она будет присутствовать во всех примерах в этой статье.
1. UTF-8 без BOM
Начнём с самой простой проблемы. Вы создали какой-то HTML-файл, открыли его в браузере и получили:
Проблема актуальна в основном для пользователей Windows, на маке я с таким ни разу не сталкивался.
Решение проблемы зависит в основном от того, каким редактором вы пользуетесь. Для пользователей Windows я рекомендую бесплатный офигительный Notepad++.
Значит, открываем файл в Notepad++ и переходим в Кодировки > Преобразовать в UTF-8 без BOM. Вопрос — почему без BOM? Потому что с BOM у вас будут постоянно вставляться пустые символы (на самом деле они не пустые, у них тоже есть своя функция, но нам она в данном случае не нужна) куда не надо, а для PHP это уже критично.
2. Мета тег charset
Если вы сделали то, что я описывал в предыдущем шаге и ваша проблема не разрешилась, тогда самое время испробовать второй метод устранения кракозябров.
Всё, что нам требуется, это вставить следующий код между тегами <head> сайта. Прежде всего проверьте, возможно этот метатег у вас уже присутствует. Если да, то посмотрите какое у него стоит значение параметра charset.
В темах WordPress обычно этот тег уже имеется по умолчанию и выглядит следующим образом:
<meta charset="<?php bloginfo('charset'); ?>" />
3. .htaccess
Если русские буквы до сих пор отображаются кракозябрами, тогда открываем ваш .htaccess, который лежит в корне сайта и вставляем туда с новой строки это:
4. Заголовки сервера через header()
Ещё один способ определения кодировки. На этот раз через PHP. На WordPress никогда не приходилось им пользоваться.
header('Content-Type: text/html; charset=utf-8');
Важно! Этот код должен вставляться до того, как будет что-либо выведено на странице сайта, иначе — ошибка.
5. Проблемы с последним символом при обрезке строки
На многих сайтах встречаются блоки с популярными записями, последними комментариями, отзывами и так далее. Обычно в таких обзорных блоках выводится часть записи/комментария/отзыва и кнопка «читать далее». Так вот, для того, чтобы вывести первые несколько предложений или первые несколько слов текста, используется функция PHP substr(). Конечно же в основном я имею ввиду англоязычные темы, которых так много в интернете. Даже если у этих тем есть локализация — то есть вроде бы она на русском — переведена админка, переведён практически весь сайт, но при этом мы встречаем такие вот косяки:
Как решить эту проблему?
Легко — всё что нам нужно, это найти функцию substr() в коде и поменять её на mb_substr().
Если после этого у вас полезут ошибки на сайт, то скорее всего multibyte-функции не поддерживаются вашим хостингом, первое, что вам следует сделать, это написать в супорт и спросить, нельзя ли их подключить на ваш аккаунт. Если нет, меняем хостинг, например на тот, которым пользуюсь я.
6. MySQL
У меня не раз бывало такое, что я подключался к MySQL, вытаскивал какие-нибудь данные, и при их выводе на сайте, текст отображался кракозябрами.
Такое может произойти, если кодировка вашего сайта не совпадает с кодировкой базы данных, к которой вы подключаетесь. В WordPress обычно таких проблем не бывает.
Для того, чтобы исправить это, после подключения к БД, делаем следующее:
mysql_query("SET NAMES 'UTF8'");
Если ни один из вышеперечисленных методов вам не помог, оставляйте комментарий и попробуем вместе разобраться.
Миша
Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.
Пишите, если нужна помощь с сайтом или разработка с нуля.
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 
mb_internal_encoding — Set/Get internal character encoding
Description
mb_internal_encoding(?string $encoding = null): string|bool
Parameters
-
encoding -
encodingis the character encoding name
used for the HTTP input character encoding conversion, HTTP output
character encoding conversion, and the default character encoding
for string functions defined by the mbstring module.
You should notice that the internal encoding is totally different from the one for multibyte regex.
Return Values
If encoding is set, then
Returns true on success or false on failure.
In this case, the character encoding for multibyte regex is NOT changed.
If encoding is omitted, then
the current character encoding name is returned.
Errors/Exceptions
As of PHP 8.0.0, a ValueError is thrown if the
value of encoding is an invalid encoding.
Prior to PHP 8.0.0, a E_WARNING was emitted instead.
Changelog
| Version | Description |
|---|---|
| 8.0.0 |
encoding is nullable now.
|
| 8.0.0 |
Now throws a ValueError ifencoding is an invalid encoding.Previously a E_WARNING was emitted instead.
|
Examples
Example #1 mb_internal_encoding() example
<?php
/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");/* Display current internal character encoding */
echo mb_internal_encoding();
?>
See Also
- mb_http_input() — Detect HTTP input character encoding
- mb_http_output() — Set/Get HTTP output character encoding
- mb_detect_order() — Set/Get character encoding detection order
- mb_regex_encoding() — Set/Get character encoding for multibyte regex
webfav at web dot de ¶
7 years ago
all together
<?php
// ------------------------------------------------------------ header('Content-Type: text/html; charset=UTF-8');mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8'); // ------------------------------------------------------------
?>
Joachim Kruyswijk ¶
16 years ago
Especially when writing PHP scripts for use on different servers, it is a very good idea to explicitly set the internal encoding somewhere on top of every document served, e.g.
mb_internal_encoding("UTF-8");
This, in combination with mysql-statement "SET NAMES 'utf8'", will save a lot of debugging trouble.
Also, use the multi-byte string functions instead of the ones you may be used to, e.g. mb_strlen() instead of strlen(), etc.
mortoray at ecircle-ag dot com ¶
17 years ago
Be aware that the strings in your source files must match the encoding you specify by mb_internal_encoding. It appears the Parser loads raw bytes from the file and refers to its internal encoding to determine their actual encoding.
To demonstrate, the following outputs as espected when the /source/ file is Latin-1 encoded:
<?php
mb_internal_encoding("iso-8859-1");
mb_http_output( "UTF-8" );
ob_start("mb_output_handler");
echo
"???<br/>";?>???
Now, a typical use of mb_internal_encoding is shown as follows. Make the change to "utf-8" but leave the /source/ file encoding unchanged:
<?php
mb_internal_encoding("UTF-8");
mb_http_output( "UTF-8" );
ob_start("mb_output_handler");
echo
"???<br/>";?>???
The output will just show the <br/> tag and no text.
Save the file as UTF-8 encoding and then the results will be as expected.
mdirks at gulfstreamcoach dot com ¶
15 years ago
In response to mortoray at ecircle-ag dot com:
The characters display fine as long as you set the Encoding to something more "Latin 1" compatible (i.e. US-ACSII, ISO-8859-1, ISO-8859-1, or Windows 1252). PHP.net auto-detects to UTF-8
Anonymous ¶
7 years ago
Note that mb_internal_encoding is not necessary in PHP 5.6
john leborgne ¶
10 years ago
i noticed that setting mb_internal_encoding('UTF-8') in my global site config.inc.php, doesn't work in my classes : it reverse back to ISO-8859-1.
Adding the call to the constructor of my top site class resolve this.
mortoray at ecircle-ag dot com ¶
17 years ago
To previous example, the PHP notes don't appear to support umlauted characters so there are question marks (?) there instead of what should be umlauated oue. Just substitute any high-order/accented character to see the effect.
В данной статье сведен перечень приемов для правильной работы сайта в кодировке UTF-8.
1
В .htacces
AddDefaultCharset UTF-8
AddCharset utf-8 .css .js .json .rss .xml
htaccess
2
Кодировка файлов
Кодировка файлов PHP – «UTF-8 без BOM». Если сохраните с ним, то в файлах, где отправляются заголовки будет ошибка.
Для файлов .htacess кодировка должна быть ANSI, иначе будет ошибка 500.
3
В HTML
Также кодировка файлов – UTF-8 и мета-тег в <body>:
<meta http-equiv="content-type" content="text/html; charset=utf-8">
HTML
или
<meta charset="utf-8">
HTML
4
В index.php
header('Content-type: text/html; charset=utf-8');
setlocale(LC_ALL, 'ru_RU.UTF-8');
PHP
5
mb_string
При обработке строковых данных использовать функции из mb_string, стандартные с UTF-8 работают некорректно. Например strlen() возвращает неверное количество символов если в строке есть русские буквы.
Настройки mb_string в index.php:
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_input('UTF-8');
mb_http_output('UTF-8');
mb_language('uni');
PHP
Или в .htaccess:
php_value mbstring.internal_encoding "UTF-8"
php_value mbstring.regex_encoding "UTF-8"
php_value mbstring.http_input "UTF-8"
php_value mbstring.http_output "UTF-8"
php_value mbstring.language "uni"
htaccess
Также во избежании проблем с кодировкой письма отправлять через функцию mb_send_mail().
6
База данных
Кодировка таблиц MySQL в utf8_general_ci, после соединения с БД сделать запрос:
In the «PHP Cookbook», they say (p.589) that to properly set the character encoding of outgoing data to UTF-8, it is necessary to edit the default_encoding configuration to utf-8.
However, I cannot find this configuration in file php.ini. Should I simply add a line that would say default_encoding = "utf-8"?
I do have a ;default_charset = «iso-8859-1». As you can see (;), right now it is not activated. Should I remove the semicolon and set it to "utf-8"? Does that take care of the default encoding?
I also found other encoding directives that I don’t know what to do about:
[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1
...
; http://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
...
;mssql.charset = "ISO-8859-1"
...
;exif.encode_unicode = ISO-8859-15
Is there any reason why I shouldn’t simply replace them all with utf-8?
asked Feb 19, 2012 at 18:02
1
You should set your default_charset to UTF-8:
default_charset = "utf-8"
(PHP Cookbook may have a typo in it if they ask you to change the default_encoding — I’ve never heard of it.)
You’ll also want to make sure that your web server is set to output UTF-8 if you’re going to outputting UTF-8 encoded characters. In Apache, this can be set by in the httpd.conf file:
AddDefaultCharset UTF-8
As for modifying the iconv, exif, and mssql encoding settings, you probably don’t need to set these (your settings have these commented out anyhow), but it’s a good idea to change them all to UTF-8 anyhow.
answered Feb 19, 2012 at 18:38
Ben DBen D
14k3 gold badges45 silver badges59 bronze badges
6
Modify the line
;default_charset = "iso-8859-1"
to read
default_charset = "utf-8"
About the other options, do not touch them. Avoid default settings, always explicitly set the encoding of in everything you do
- database connections,
- reading and writing files,
- converting with iconv.
Also, beware of the encoding in which your PHP files are saved, make sure that they are in UTF-8, especially if they contain strings to be displayed or compared.
answered Feb 19, 2012 at 18:36
gioelegioele
9,4325 gold badges55 silver badges79 bronze badges
I had a problem on my MySQL query that it would not recognize some Latin accentuation, so the query would fail. I thought it could be the PHP file and so on, till I found out that using PDO to call the MySQL function I had to add the character set. The weird thing is that on the previous server I used it worked fine!
$dsn = 'mysql:host=localhost;dbname=retirodo_main;charset=utf8';
- - - - - - - - - - - - - - - - - - - - - - - - - ^^^^^^^^^^^^
answered Oct 29, 2013 at 23:31
MiguelMiguel
3,2432 gold badges32 silver badges28 bronze badges
2
At the htaccess level (.htaccess file), the PHP directive should be php_value default_charset UTF-8.
answered Nov 11, 2017 at 20:45
ontananzaontananza
3426 silver badges7 bronze badges
To resolve it, I changed «UTF-8» to «UTF-8» (without the dash), solving the problem instead.
It was on CentOS.
answered Nov 30, 2016 at 17:44
1
Просмотров: 24383
Дата последнего изменения: 23.05.2022
Сложность урока:
4 уровень — сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
5
Недоступно в лицензиях:
Ограничений нет
Рассмотрим общий порядок конвертации сайта с кодировки cp1251 в UTF-8.
Внимание! Прежде чем приступить к конвертации сайта обязательно сделайте резервную копию сайта и базы данных.
Настоятельно рекомендуем
предварительно потренироваться выполнять конвертацию на отдельной копии сайта. Конвертация сайта сложная операция и каждый случай индивидуален. При её выполнении высока вероятность потерять важные данные, если что-то пойдет не так!
Общий порядок действий
Редактировать файлы и вносить правки на сервере можно подключаясь по SSH.
Общий порядок действий:
- В региональных настройках Настройки > Настройки продукта > Языковые параметры > Региональные настройки сменитe кодировку на UTF-8 для всех языков;
-
mbstring.func_overload до версии 20.100.0 модуля main
- Установите в файле настроек php.ini значение
default_charset = "utf8";Расположение файла настроек php.ini можно посмотреть заранее в административном разделе на странице
Настройки PHP
Страница Настройки PHP (Настройки > Инструменты > Диагностика > Настройки PHP) служит для отображения информации о текущих настройках PHP.Подробнее в курсе Администратор. Базовый
(Loaded Configuration File) или с помощью PHP функции phpinfo().Если сайт размещен на Хостинге, возможно понадобится обратиться к хостинг провайдеру для внесения этих настроек.
- Добавьте в
/bitrix/php_interface/dbconn.phpdefine("BX_UTF", true);В этом же файле удалите строки, относящиеся к кодировке cp1251:
setlocale(LC_ALL, 'ru_RU.CP1251'); setlocale(LC_NUMERIC, 'C'); mb_internal_encoding("Windows-1251"); - Установите значение ‘value’ => true для utf_mode в файле
/bitrix/.settings.php:utf_mode => array( 'value' => true, 'readonly' => true, ), - Перекодируйте всю базу данных в UTF-8. Вероятнее всего придётся обращаться за помощью к администратору сервера.
- Установите в файле
/bitrix/php_interface/after_connect.php$DB->Query("SET NAMES 'utf8'"); $DB->Query('SET collation_connection = "utf8_unicode_ci"');и в файле
/bitrix/php_interface/after_connect_d7.php$this->queryExecute("SET NAMES 'utf8'"); $this->queryExecute('SET collation_connection = "utf8_unicode_ci"'); //До версии main 22.0 вместо $this использовалась переменная $connection. - Установите в
/.htaccess:php_value default_charset utf-8
- Перекодируйте все файлы сайта в UTF-8.
- Сбросьте весь кеш;
- Выйдите и зайдите заново на сайт чтобы обновить данные сессии.
База данных
Для конвертации базы (БД) потребуется сменить кодировку самой базы, всех её таблиц и всех текстовых полей таблиц. НЕ выполняйте конвертацию БД из административной части. Используйте для этого другие доступные средства.
В простом случае (без сериализованных данных) перекодировать базу данных и все таблицы можно следующим образом:
- Изменить кодировку самой базы данных сайта:
ALTER DATABASE имя_базы_данных charset=utf8;
- Изменить кодировку соединения с базой данных:
SET NAMES 'utf8'
ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
- Выполним запрос, который позволит найти все таблицы базы данных и сформировать запрос на смену кодировки для каждой:
SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;') as sqlcode FROM `information_schema`.`TABLES` t WHERE 1 AND t.`TABLE_SCHEMA` = 'имя_базы_данных' ORDER BY 1 ; - В качестве ответа получим список запросов вида:
ALTER TABLE `имя_базы_данных`.`имя_таблицы` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
- Выполните все запросы. База данных и таблицы перекодированы.
Внимание: Если в базе данных хранятся сериализованные данные, то приведенный выше метод конвертации для них не подойдет. Используйте специальные методы / средства для конвертации таких данных.
Файлы
В простом варианте, когда все файлы сайта в кодировке cp1251, перекодировать их в UTF-8 можно выполнив такую команду в корневой папке сайта (для UNIX систем):
// переходим в корневую папку сайта. Например:
cd /var/www/html/
// выполняем команду для перекодирования файлов
find . -name '*.php' -type f -exec iconv -fcp1251 -tutf8 -o /tmp/tmp_file {} ; -exec mv /tmp/tmp_file {} ;
Важно: Способ не подходит для сайтов на нескольких языках, т.к. в таком случае в структуре будут присутствовать файлы в различных кодировках.
Использование внешних программ или конвертация файлов вручную
Часто при использовании внешних программ для конвертации в файлы добавляется специальная последовательность символов, так называемый BOM. Эти символы должны находиться только вначале файла, а поскольку итоговая страница является составной из нескольких php файлов, то спецсимволы появляются в теле страницы. Если делаете конвертацию файлов вручную — не сохраняйте с BOM!
Советы и ссылки
Основные шаги по конвертации сайта выполнены. Если после конвертации возникают ошибки при открытии сайта, включите режим отладки 'debug' => true в файле /bitrix/.settings.php. Это позволит видеть где и какие возникают ошибки.
Обязательно выполните
проверку системы
Форма Проверка системы (Настройки > Инструменты > Проверка системы) предназначена для всесторонней проверки соответствия параметров системы, на которой осуществляется функционирование проекта, минимальным и рекомендуемым техническим требованиям продукта.
Подробнее в курсе Администратор. Базовый.
. По результатам проверки будет видно, что ещё нужно исправить. Пользуйтесь подсказками под знаками вопроса справа.
Если возникли ошибки с таблицами базы данных (последняя строка проверки), можно посмотреть
логи в журнале
. В конце файла логов указаны будут указаны запросы, с помощью которых можно исправить эти ошибки. Перед началом исправления рекомендуется сделать копию базы данных.
Список ссылок по теме:
- Конвертация сайта из cp1251 в UTF-8 (блог разработчиков);
- Выбор кодировки сайта;
- Настройка параметров ядра;
- Проверка системы в курсе Администратор. Базовый.
На сколько бы это глупо не казалось, но для удачного выставления кодировки необходимо выполнить целых 11(!) правил.
Хочу зарание предупредить, если какая-то из настроек в .htaccess повлечет за собой ошибку 500, это значит, что хостинг запретил менять этот параметр на сервере. В таком случае проверьте тот факт, что у Вас UTF-8 и в случае чего обратитесь к админам хостинга.
И для тех, кто попал на эту страницу с вопросами об Ajax: Ajax работает в кодировке UTF-8.
Правило №1: Указываем в HTML верстке в теге первой строчкой, кроме случаев, где мы будем использовать тег
, так как он так же как и кодировка имеет приоритет над расположением, следующий код:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Правило №2: Указываем кодировку для PHP и самого файла, для этого нам необходимо выставить заголовок функцией header(). Выставляем его в самом начале нашего файла (абсолютно в самом начале), сразу после указания уровня вывода ошибок:
<?php
error_reporting(-1);
header('Content-Type: text/html; charset=utf-8');
Правило №3: Кодировка для подключения к к БД MySQL. Устанавливается после подключения к БД и выбора бд (mysql_connect, mysql_select_db). Если у нас модуль mysql:
<?php
mysql_set_charset('utf8');
или улучшенный модуль mysqli:
<?php
$mysqli->set_charset("utf8");
Правило №4: Кодировка в .htaccess:
AddDefaultCharset UTF-8
Правило №5: Кодировка для библиотеки mb, начиная с версии php 5.4 можно не указывать, так как по умолчанию будет использоваться именно UTF-8. Ну а пока прописываем её в файле .htaccess:
php_value mbstring.internal_encoding UTF-8
Либо в самом PHP, что в итоге выполнит одни и те же действия:
mb_internal_encoding("UTF-8");
Правило №6: При сохранении файлов (обязательно ВСЕХ!) выбрать кодировку UTF-8 without BOM, повторюсь, without BOM — это необходимая настройка, в противном случае Ваш сайт не будет работать как надо. Для тех, кто пользуется удобной программой DreamWeaver:
Modify => Page Properties => Title/Encoding и выставляем «Encoding: UTF-8», после чего нажимаем ReLoad, убираем галочку с BOM «Include Unicode Signature (BOM)». Apply + OK.
Модификации => Свойства страницы => Заголовок/Кодировка и выставляем кодировку UTF-8. Нажимаем «перезагрузить», убрали галочку с Подключить Юникод Сигнатуры (BOM). Применить и OK.
Правило №7: если на данный момент какой-то из текстов был введён на странице или в БД — его необходимо перенабрать. Дело в том, что символ в одной кодировке представляет один набор бит для русских символов, а в другой — другой. Именно поэтому необходимо его либо перенабрать, либо перекодировать. Современные программы имеют возможность перевести текст из одной кодировки в другую. Об этой возможности интересуйтесь в мануалах Ваших программ.
Правило №8: Есть исключение, когда текст приходит к Вам на страницу с другого сайта в другой кодировке. Тогда на PHP есть удобная функция для перевода из одной кодировки в другую:
<?php
$var = iconv('utf-8', 'windows-1251', $var); //для переменной $var
Правило №9: Для строковых функций strlen, substr, необходимо использовать их аналоги на библиотеке mb_, а именно: mb_strlen, mb_substr, то есть к функции дописываем mb_ .
Правило №10: Для работы с регулярными выражениями необходимо указывать модификатор u . Это обязательный параметр!
Правило №11: Для CSS файлов указывается кодировка так:
@charset "utf-8";
В заключение скажу, что символы в кодировке WIN-1251 состоят из 1 байта, то есть 8 бит, а в свою очередь в кодировке UTF-8 символы могут состоять от 1 до 4 байт, всё дело в том, что кодировка UTF-8 позволяет создавать мультиязычные сайты, так как все существующие в мире символы в ней присутствуют.
Ради любопытства русская буква в кодировке UTF-8 занимает 2 байта, именно поэтому за 1 символ функция strlen возвращает длину 2, то есть 2 байта, а mb_strlen возвращает уже правильную длину в 1 символ.
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
Доброго времени суток, уважаемые читатели блога Site on! Сегодня речь пойдёт о такой мелочи, как кодировка страниц наших с вами сайтов на Joomla, WordPress и вовсе без CMS. Несмотря на то, что в этом нет ничего сложного, множество людей до сих пор задают вопросы на форумах, связанные с этой проблемой.
Сейчас самой распространённой кодировкой по праву считается UTF-8 и чтобы не растягивать статью не нужными разглагольствованиями просто скажу, что я абсолютно всем рекомендую использовать именно её.
Как изменить кодировку страницы?
Теперь, когда мы знаем, какая кодировка нам нужна, первым делом нужно сохранить все файлы, которые нужно перекодировать в UTF-8 без BOM, это можно сделать с помощью большинства текстовых редакторов для программистов (не Microsoft Office), например, PSPad или Notepad++, а также множество других.
Перекодирование в UTF-8 на примере PSPad
Если Вы используете бесплатный редактор PSPad, то всё что вам необходимо, это открыть в нём нужный файл, выбрать из верхнего меню «Формат» и выбрать из выпавшего списка UTF-8, после чего обратите внимание на смену кодировки в нижнем правом углу вашего окошка с PSPad, незабываем сохранить изменения!

Как правильно указать нужную кодировку?
Данную статью можно было бы поместить в раздел PHP, так как именно PHP играет в нашем спектакле самую значимую роль. Всегда указывайте кодировку страниц ваших сайтов прежде всего через PHP заголовок:
header("Content-Type: text/html; charset=utf-8");
который должен быть как можно выше в вашем коде, обязательно перед первым выводом любого символа на странице (в том числе HTML теги, просто буквы, пробелы). Данный способ является наиболее приоритетным, в то время как мета-тег:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Просто ещё раз подчёркивает и объявляет (а не назначает!) принадлежность к той или иной кодировке, но никак не говорит серверу посылать документы именно в данной кодировке, в отличие от PHP. Именно PHP говорит серверу, на котором находится ваш сайт, в какой кодировке послать страницу клиенту. Так же это можно делать и с помощью .htaccess – файла тонкой конфигурации веб-сервера Apache, но лично мне больше импонирует вариант с PHP. Тем более я слышал, что не все хостеры предоставляют конфигурацию с помощью .htaccess, слава богу не сталкивался 

Итак, после того как мы пересохранили все нужные нам файлы в UTF-8 без BOM и указали кодировку с помощью PHP, остаётся лишь «подтвердить» её мета тегом, который также обязательно нужно указывать! Это рекомендует сам W3C для того, чтобы устройства, роботы и клиентские браузеры могли безошибочно определить, в какой кодировке ваш сервер послал страницу.
Как поменять кодировку страниц в Joomla?
Давайте рассмотрим пример правильного указания кодировки на Joomla 2.5 Это вовсе не сложно и займёт менее минуты:
1) Заходим в главный файл нашего шаблона сайта под названием index.php. Он находится по адресу: /templates/ваш_шаблон/index.php

2) Перекодируем этот файл с помощью текстового редактора для программистов, как было описано для PSPad.
3) Сразу после строки, которая предотвращает прямое обращение к файлу
defined("_JEXEC") or die;
пишем код, который пошлёт заголовок с нашей кодировкой:
header("Content-Type: text/html; charset=utf-8");
Если у вас возникли трудности с поиском данной строки, то можете вставить код просто в самом вверху, например, первой строкой файла, главное не забудьте, что PHP код всегда должен быть размещён внутри конструкции <?php ваш код ?> В нашем случае:
<?php
header("Content-Type: text/html; charset=utf-8");
?>
4) Не забываем проверить, что Joomla поставила правильный мета-тег:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Заметка:
В Joomla 2.5 за вывод мета-тегов и прочей информации, заключённой в «голове» нашего сайта, отвечает следующая конструкция:
<jdoc:include type="head" />
Как поменять кодировку страниц в WordPress и других CMS?
Для сайтов на WordPress и любых других сайтов смысл остаётся точно таким же. Вы находите основной файл, отвечающий за вывод информации на вашем сайте, перекодируете его в UTF-8 без BOM, указываете PHP заголовок и мета-тег.
Исключения составляют сайты на чистом HTML, где PHP кода не может быть в принципе. Для таких сайтов можно просто пропустить данный шаг.
Вот и всё на сегодня, спасибо за ваше внимание и до встречи в новых статьях блога о самостоятельном создании и продвижении сайтов – Site on!
Пожалуйста, оцените эту статью
Средняя оценка: 4.7 из 5 (проголосовало: 40)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
I want to run text through a filter to ensure it is all UTF-8 encoded. What is the recommended way to do this with PHP?
chills42
14k3 gold badges43 silver badges77 bronze badges
asked Sep 17, 2008 at 4:19
Your question is unclear, are you trying to encode something? If so utf8_encode is your friend. Are you trying to determine if it doesn’t need to be encoded? If so, utf8_encode is still your friend, because you can check that the result is the same as the input!
answered Sep 17, 2008 at 4:22
Don NeufeldDon Neufeld
22.4k11 gold badges51 silver badges50 bronze badges
Check the multi-byte string functions here
answered Sep 17, 2008 at 4:27
Bahadır YağanBahadır Yağan
5,3173 gold badges34 silver badges38 bronze badges
Given a stream of bytes, you have to know what encoding it is to begin with — email use mime headers to specify the encoding, http uses http headers to specify the encoding. Also, you can specify the encoding in a meta tag in a web page, but it is not always honored.
Anyway, once you know what encoding you want to convert from, use iconv to convert it to utf8. look at the iconv section of the php docs, there’s lots of good info there.
Ah, Thomas posted the link I was looking for. A must read.
answered Sep 17, 2008 at 4:32
DGMDGM
26.5k7 gold badges58 silver badges79 bronze badges
The easiest way to check for UTF-8 validity:
-
If only one line allowed:
preg_match('/^.*$/Du', $value) -
If multiple lines allowed:
preg_match('/^.*$/sDu', $value)
This works for PHP >= 4.3.5 and does not require any non-default PHP modules.
A J
3,91014 gold badges39 silver badges53 bronze badges
answered Sep 17, 2008 at 14:16
TometzkyTometzky
21.8k4 gold badges59 silver badges72 bronze badges
I want to run text through a filter to ensure it is all UTF-8 encoded. What is the recommended way to do this with PHP?
chills42
14k3 gold badges43 silver badges77 bronze badges
asked Sep 17, 2008 at 4:19
Your question is unclear, are you trying to encode something? If so utf8_encode is your friend. Are you trying to determine if it doesn’t need to be encoded? If so, utf8_encode is still your friend, because you can check that the result is the same as the input!
answered Sep 17, 2008 at 4:22
Don NeufeldDon Neufeld
22.4k11 gold badges51 silver badges50 bronze badges
Check the multi-byte string functions here
answered Sep 17, 2008 at 4:27
Bahadır YağanBahadır Yağan
5,3173 gold badges34 silver badges38 bronze badges
Given a stream of bytes, you have to know what encoding it is to begin with — email use mime headers to specify the encoding, http uses http headers to specify the encoding. Also, you can specify the encoding in a meta tag in a web page, but it is not always honored.
Anyway, once you know what encoding you want to convert from, use iconv to convert it to utf8. look at the iconv section of the php docs, there’s lots of good info there.
Ah, Thomas posted the link I was looking for. A must read.
answered Sep 17, 2008 at 4:32
DGMDGM
26.5k7 gold badges58 silver badges79 bronze badges
The easiest way to check for UTF-8 validity:
-
If only one line allowed:
preg_match('/^.*$/Du', $value) -
If multiple lines allowed:
preg_match('/^.*$/sDu', $value)
This works for PHP >= 4.3.5 and does not require any non-default PHP modules.
A J
3,91014 gold badges39 silver badges53 bronze badges
answered Sep 17, 2008 at 14:16
TometzkyTometzky
21.8k4 gold badges59 silver badges72 bronze badges








