- PHP Кодировка страницы
- Кодировки скриптов (шаг 1)
- Кодировка таблиц MySQL. (шаг 2)
- Кодировка самой HTML страницы. (Шаг 3)
- Локаль используемая браузером пользователя. (Шаг 4)
- Читайте также похожие статьи:
- Кодировка текста php-скрипта в консоли в Windows
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками php windows cmd encoding cli или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Настройка локали в php под windows для работы с UTF-8?
- Заметки Лёвика
- web программирование, администрирование и всякая всячина, которая может оказаться полезной
- PHP iconv — кодировка из utf-8 windows-1251
- Если не работает iconv
- iconv array для массива
- Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”
- Конвертация кодировок utf-8 и win-1251 в PHP через iconv
PHP Кодировка страницы
Здравствуй уважаемый читатель блога 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 напишем запрос:
Выглядеть это должно вот так:
Жмем ОК и получаем информацию о кодировках таблицы
Значения на против character_set_client и character_set_results должны совпадать, так как эти параметры отвечают за кодировку, в которой данные поступают в базу и за кодировку в которой данные берутся из базы.
Если они у вас различаются, то нужно в PHP коде в ручную установить нужную кодировку. Делается это вот такой строчкой:
После этого три переменные character_set_client, character_set_connection и character_set_results примут значение utf8.
Подробнее о том как с помощью PHP работать с базой данных можно прочесть в статье PHP работа с базой данных (Часть 1-3).
Кодировка самой HTML страницы. (Шаг 3)
Теперь данные взятые с базы и данные обрабатываемые в php скрипте, будут совпадать по кодировке, и выводиться в понятном для человека тексте. Но это еще не все, нужно указать кодировку в разделе для мета тегов:
Либо в cкрипте настроек php командой:
Если кодировка HTML будет задана сразу двумя способами, то приоритетным будет задание кодировки из php скрипта.
Также можно глобально задать правило кодировки HTML в файле .htaccess добавив в него строку:
Локаль используемая браузером пользователя. (Шаг 4)
Еще одна важная деталь при корректном отображении текста это установка локали:
При установки такой локали, пердставители других стран использующие другую кодовую страницу в своей операционной системе, будут видеть русский текст.
Мы рассмотрели основные моменты возникновения противоречий в кодировках веб страницы, подведем итоги. Для того чтобы ваш рускоязычный сайт был всегда доступен для чтения, необходимо прописать в PHP скрипте настроек такие строки:
Если у тебя дорогой читатель остались вопросы по данной статье о PHP кодировке страниц, то смело задавай их в комментариях.
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Кодировка текста php-скрипта в консоли в Windows
У меня есть большое PHP-приложение, запускающееся через консоль. Все файлы с кодировкой UTF-8, вместо echo использую свою функцию для вывода текста. Консоль Windows (до 10-ой) никак не хочет выводить русские символы из PHP-скрипта. Для теста делал так: echo mb_convert_encoding(«‘йоу привет'», «CP866», «UTF-8»); — первые две буквы выводит, остальные буквы — невидимые символы. Пробовал кодировку в консоли поменять на Windows-1251: chcp 1251 . При этом ЛЮБЫЕ русские буквы в консоли превратились в кракозябры. Затем echo mb_convert_encoding(«‘йоу привет'», «CP1251», «UTF-8»); — все буквы невидимые Пробовал перевести кодировку консоли в UTF-8: chcp 65001 . Язык в консоли изменился на английский и теперь вообще отказывается хоть как-то принимать русские буквы. Затем echo «‘йоу привет'»; и просто кракозябры. В Windows 10 никаких проблем с кодировкой нет, даже ничего переводить не надо. В версиях Windows ниже — ни в какую.
1 ответ 1
Там дело не в кодировке видимо, а в шрифте. Стандартный Consolas не поддерживает кириллицу (в Windows 10 это уже пофиксили).
Так что поменяйте его в свойствах консоли на шрифт Lucida Console:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php windows cmd encoding cli или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.4.16.39093
Настройка локали в php под windows для работы с UTF-8?
Создаём файл index.php в кодировке UTF-8 без BOM c таким содержанием:
И запускаем скрипт под Windows.
Я получаю следующий вывод:
Число: 19, месяц: ������, день недели: �����������
Иногда слетает на такое:
Число: 19, месяц: November, день недели: Monday
Принудительное выставление локали
так же ничего не меняет.
однако если у файла кодировка Windows-1251 , то никаких проблем не происходит.
Кто-то может подсказать как решить сию проблему?
Обязательно требование сохранить кодировку у файлов UTF-8 и заставить Windows нормально с ними работать. Это реально?
- Вопрос задан более трёх лет назад
- 16545 просмотров
Замечу так же что если убрать функцию setlocale() из приведенного выше кода, то изредка локаль вообще слетает на английскую и текст получается следующий:
Число: 19, месяц: November, день недели: Monday
Чем это может быть обосновано?
Говорят под Windows strftime кладёт на выбранную кодировку в локали и работает в однобайтовой кодировке, соответствующей запрошенному языку.
Можно, разве что, перед каждыми подобными функциями (переключив на всякий случай локаль на знакомую винде), перекодировать ввод функции в однобайтную кодировку, вызывать ей, после чего перекодировать результат в utf-8.
Заметки Лёвика
web программирование, администрирование и всякая всячина, которая может оказаться полезной
PHP iconv — кодировка из utf-8 windows-1251
При помощи функции php iconv (строго говоря, это не совсем функция PHP, она использует стороннюю библиотеку (есть iconv.dll и php_iconv.dll или iconv.so), которой может не быть на хостинге) легко преобразовать кодировку (например, из windows-1251 в utf-8 и наоборот:
$s = iconv( «cp1251″,»UTF-8», $s);
$s = iconv(«UTF-8», «windows-1251», $s);
Однако, если не работает iconv на хостинге, а преобразовать текст из одной кодировки в другую необходимо, можно воспользоваться сторонними функциями (на самом деле, встречал несколько вариантов — какой из них лучше.. или точнее “более рабочий” — не скажу).
Про преобразование UFT-8 сущностей я уже писал ранее , однако иногда требуется наоборот перевести текст из cp1251 в utf-8 — например.
Если не работает iconv
function iconv ($in_charset, $out_charset, $str) string — для преобразования из Windows в UTF-8 выполняем один из вызовов
iconv( «cp1251″,»UTF-8», $s);
iconv( «windows-1251″,»UTF-8», $s);
выдаёт пустую строку (если в $s нет английских символов — они в любой кодировке отображаются одинаково) на некоторых хостингах можно попробовать использовать функцию mb_convert_encoding — у неё другой порядок аргументов!
function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) string
Т.е. чтобы преобразовать текст из кодировки windows-1251 в UTF-8 следует выполнить:
mb_convert_encoding($s,»UTF-8″,»windows-1251″);
iconv array для массива
В некоторых ситуациях преобразовать одномерный или многомерный массив из одной кодировки в другую (например, из utf8 в windows-1251) с сохранением ключей массива. Для решения, можно использовать несколько способов.
// если не требуется сохранять предыдущий массив, для экономии
// передаем его по ссылке, происходит замена внутри
function utf8to1251(&$text) <
$text = iconv(«utf-8», «windows-1251», $text); //without return
>
array_walk_recursive($array, «utf8to1251»);
Или, если требуется оставить исходный массив без изменений — можно воспользоваться:
$newArray = array_map(create_function(‘$v’, ‘return iconv(«utf-8», «windows-1251», $v);’), $oldArray);
Метки: iconv
Опубликовано Пятница, Октябрь 21, 2011 в 15:02 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете оставить комментарий. Пинг отключен.
Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)
html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)
ссылка (для отправки по почте)
Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”
Как быть с запросом select к базе mssql не понимает кирилицу
“select
[Название]
,[номер]
, [Removed]
from imdb.dbo. Оконечное оборудование “;
Следует привести столбцы (или всю базу данных сразу) к соответствующему сравнению (кодировке)
ALTER DATABASE COLLATE Cyrillic_General_CI_AS
Или использовать Nvarchar
declare @test TABLE
(
Col1 varchar(40),
Col2 varchar(40),
Col3 nvarchar(40),
Col4 nvarchar(40)
)
INSERT INTO @test VALUES
(‘иытание’,N’иытание’,’иытание’,N’иытание’)
SELECT * FROM @test
В старом скрипте на php 5.3 работает
function conv($text) <
return iconv(’UTF-8′, ‘WINDOWS-1251′, $text);
>
Если изменяю версию php 5.6 то не перекодируется. Не подскажете?
Конвертация кодировок utf-8 и win-1251 в PHP через iconv
Обычно php страница или сайт имеет одну базовую кодировку. Я работаю только с UTF-8, но бывают случаи, когда приходится использовать какой-нибудь php файл с кодировкой win-1251, а передаваемые в него значения идут в кодировке UTF-8. В этом случае после исполнения скрипта появляются кракозябры.
Таких ситуаций может быть множество, например, при использовании функции отправки сообщений mail(), работе с PDF обработкой или даже при различных действиях с БД. В идеале нужно обязательно избавляться от таких хвостов и не допускать в коде функции конвертации, но если это просто невозможно, то на помощь вам придет функция iconv.
Синтаксис функции: $string= iconv(‘начальная кодировка’, ‘конечная кодировка’, $string);
Здесь $string — строка, кодировку которой мы изменяем
Из этого выходит, что для того, чтобы преобразовать строку из кодировки utf-8 в win-1251 нужно писать следующее: $string= iconv(‘utf-8’, ‘win-1251’, $string);
Из win-1251 в utf-8: $string= iconv(‘win-1251’, ‘utf-8’, $string);
На заметку, помните, что кодировку в php странице можно указывать за счет установки header-а документа. Например, если ваша страница в UTF-8 без BOM, то в самом начале документа ставьте: . Если же windows 1251, то сам документ должен быть в ANSI, а в первой строке можете поставить: . Иногда эти манипуляции помогают с письмами, которые приходят в кракозябрах из-за неверной кодировки.