- Кодировка в PHP
- Настройка локали в php под windows для работы с UTF-8?
- Решение проблем неправильной кодировкой веб-страницы
- Неправильная кодировка HTML страниц
- Как установить UTF-8 кодировку в PHP
- Неправильная кодировка результатов из базы данных MySQL
- Изменение кодировки файлов
- Как узнать, какую кодировку отправляет сервер
- Какую кодировку выбрать для веб-сайта
- Конвертация кодировок utf-8 и win-1251 в PHP через iconv
- Поддерживаемые кодировки символов
Кодировка в PHP
Кодировка PHP
Помогите пожалуйста. Недавно начал изучать PHP & MySQL и сталкнулся с одной проблемой. Вместо.
PHP кодировка
что делаю не так,, на локальном сервере(open server) работает показывает нормально, как загрузил на.
PHP кодировка
Уже как неделю ищу причину проблемы в кодировке. Данные получаются file_get_contents и.
php кодировка
Подскажите, пожалуйста, почему в окне браузера появляются иероглифы. В mysql phpMyAdmin в полях.
переведи БД на windows-1251 или файлы пхп ютф
Добавлено через 1 минуту
и причем тут БД, ты просто выводишь строку в браузер, я не вижу обращения к БД
Подскажите, а что если происходит такая вещь:
есть файл назовем его main.php, след. содержания (упрощаю для понимания).
файл inc.php собственно такой:
1. Запускаю. Получаю данные:
Внимание! Действие не выполнено
ѕС?РёР±РєР° РїСЂРё
2. Понимаю, что вся страница выводится в win1251, а строка судя по крокозябрам в UTF8
3.Смотрю кодировку — действительно. Кодировка win1251.
4.Вручную меняю кодировку отображения в браузере на UTF8, и получаю:
Т.е. только текст подключаемой страницы выводится нормально.
5. Получается что всё то что находится на основной странице (на которой есть ) перекодируется правильно, а что подключается — выводится в кодировке UTF8?
Но почему так, ведь сами файлы сохранены в ANSI я их писал в одном и том-же редакторе — notepad++!
Я ничего не пойму!
Подъитожу вопрос:
Почему в одном одни данные выводятся как UTF8, а другие в win1251, хотя
во-первых: оба файла в ANSI,
во-вторых: второй файл инклудится в «тело» первого и соответственно когда применяется , которая говорит браузеру применить для отображения windows-1251 два файла уже единое целое и исходя из того что оба в одинаковой кодировке, они должны одинаково и отображаться!!
?
Настройка локали в 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.
Решение проблем неправильной кодировкой веб-страницы
При неправильной кодировке весь сайт или его часть отображаются в виде «кряпозяблов», т.е. непонятных символов, делающих текст нечитаемым. Такая ситуация может возникнуть при неверной настройке кодировки веб-сервера или при отсутствии настроек. Рассмотрим возможные варианты и способы устранения проблем
Неправильная кодировка HTML страниц
Создадим тестовый файлик:
Скопируем в него следующий HTML код, в котором отсутствует указание кодировки и посмотрим, какие проблемы могут с ним возникнуть и как их решить:
Как можно видеть, кодировка браузером определена неправильно:
Имеется несколько способов исправить эту ситуацию. Начнём с самого простого – явно указать кодировку для веб-страницы. Это делается метатегом, который должен быть расположен внутри тэга head:
Добавим эту строку к нашему тестовому файлику, чтобы получилось так:
Как мы можем убедиться на следующем скриншоте, проблема решена:
Если кодировка вашего файла отличается от UTF-8, то вместо неё поставьте windows-1251 или ту, которая соответствует кодировке веб-страницы. Чтобы научиться определять кодировку файлов, посмотрите эту инструкцию.
Это был самый простой способ исправления проблемы с кодировкой – без изменения настроек сервера.
Вернём наш тестовый файл в исходное состояние и продолжим изучение способов указания кодировки.
Если файлы .htaccess включены настройками Apache, то эти файлы можно использовать чтобы указывать кодировку отправляемых веб-сервером страниц. Чтобы включить поддержку файлов .htaccess в конфигурационном файле Apache ( /etc/apache2/apache2.conf ) найдите группу строк
И в ней замените
После этого сервер нужно перезапустить.
Файл .htaccess должен быть размещён в той же директории, что и сайт. Мой сайт размещён в корневой директории веб-сервера. Если у вас также, то теперь в папке /var/www/html/ создайте файл .htaccess и добавьте в него директиву AddDefaultCharset после которой укажите желаемую кодировку. Примеры
Можно указать кодировку, которая будет применена только к файлам определённого формата:
Набор файлов может быть любым, например:
Следующий вариант является альтернативным и также позволяет устанавливать кодировку для файлов определённого типа, для него нужно, чтобы был включён mod_headers:
Ещё один вариант, который также можно использовать в файле .htaccess для установки кодировки UTF-8:
Если сайт на PHP, то дополнительно может понадобиться продублировать кодировку с php_value default_charset:
Можно вместо создания файла .htaccess установить кодировку в конфигурационном файле веб-сервера. Для Apache CentOS/Fedora это файл httpd.conf, а на Debian/Ubuntu это файл apache2.conf. Добавьте следующую строку для установки кодировки и перезапустите веб-сервер, чтобы изменения вступили в силу:
Как установить UTF-8 кодировку в PHP
В PHP скрипте для установки кодировки используется header, например:
Обычно вместе с кодировкой также указывают тип содержимого (в примере вариант для HTML страницы):
Ещё один вариант для RSS ленты:
Помните, что функция header должна быть вызвана перед любым выводом в браузер. В противном случае (если вывод в браузер уже был сделан), то уже были отправлены и заголовки. Очевидно, что в этом случае их уже невозможно поменять. Если в браузер было выведено сообщение об ошибке, то заголовки также уже были отправлены и использование header вызовет ошибку. Для проверки, были ли уже отправлены заголовки, используйте headers_sent.
Описанный способ работает только когда PHP скрипт полностью генерирует содержимое страницы. Статические страницы (такие как html) вы должны сохранять в кодировке utf-8. Большинство веб серверов обратят внимание на кодировку файла и добавят соответствующий заголовок. На самом деле, сохранение PHP файла в кодировке utf-8 приведёт к такому же результату.
Неправильная кодировка результатов из базы данных MySQL
Если ваш сайт состоит из статической части (шаблон) и динамической, которая формируется из данных, получаемых из базы данных, то может возникнуть ситуация, когда часть сайта имеет правильную кодировку, а другая часть сайта имеет неправильную. В этом случае бесполезно менять настройки веб-сервера – поскольку всё равно часть страницы будет иметь неправильную кодировку.
Нужно начать с определения кодировки ваших таблиц. Можно посмотреть в phpMyAdmin:
Обратите внимание на столбец «Сравнение», запись «utf8_unicode_ci» означает, что используется кодировка UTF-8.
Можно подключиться к СУБД MySQL и проверить кодировку таблиц без phpMyAdmin. Для этого:
Если вы забыли имя базы данных, то выполните команду:
Предположим, я хочу посмотреть кодировку для таблиц в базе данных information_schema
Если вы забыли имя таблиц, выполните:
Далее выполните команду, в которой имя_таблицы замените на настоящее имя таблицы:
Вы увидите примерно следующее:
Смотрите столбец 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 нужно выполнять последовательно запросы:
В PHP это можно сделать примерно так:
Обратите внимание, что UTF8 вам нужно заменить на ту кодировку, которая используется для ваших таблиц.
Изменение кодировки файлов
Если вы решили пойти другим путём и вместо установки новой кодировки изменить кодировку ваших файлов, то посмотрите статью «Как конвертировать файлы в кодировку UTF-8 в Linux». В ней рассказано, как узнать текущую кодировку файлов и как конвертировать файлы в любую кодировку (не только UTF-8).
Как узнать, какую кодировку отправляет сервер
Если вы хотите узнать, какие настройки кодировки имеет веб-сервер (какую кодировку передаёт в заголовках), то воспользуйтесь следующей командой:
В ней вместо URL вставьте реальный адрес проверяемого сайта. Если сайт использует HTTPS, то укажите адрес сайта вместе с протоколом, например
Какую кодировку выбрать для веб-сайта
Рекомендуется выбрать кодировку UTF-8. Это более универсальная кодировка, практически, она стала стандартом. У вас не будет проблем с отображением необычных символов и букв из других алфавитов.
Конвертация кодировок 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, а в первой строке можете поставить: . Иногда эти манипуляции помогают с письмами, которые приходят в кракозябрах из-за неверной кодировки.
Поддерживаемые кодировки символов
В настоящее время модулем mbstring поддерживаются следующие кодировки символов. Любая из этих кодировок символов может быть указаны в параметре encoding функций mbstring .
Следующие кодировки символов поддерживаются в этом расширении PHP:
- UCS-4*
- UCS-4BE
- UCS-4LE*
- UCS-2
- UCS-2BE
- UCS-2LE
- UTF-32*
- UTF-32BE*
- UTF-32LE*
- UTF-16*
- UTF-16BE*
- UTF-16LE*
- UTF-7
- UTF7-IMAP
- UTF-8*
- ASCII*
- EUC-JP*
- SJIS*
- eucJP-win*
- SJIS-win*
- ISO-2022-JP
- ISO-2022-JP-MS
- CP932
- CP51932
- SJIS-mac** (alias: MacJapanese)
- SJIS-Mobile#DOCOMO** (alias: SJIS-DOCOMO)
- SJIS-Mobile#KDDI** (alias: SJIS-KDDI)
- SJIS-Mobile#SOFTBANK** (alias: SJIS-SOFTBANK)
- UTF-8-Mobile#DOCOMO** (alias: UTF-8-DOCOMO)
- UTF-8-Mobile#KDDI-A**
- UTF-8-Mobile#KDDI-B** (alias: UTF-8-KDDI)
- UTF-8-Mobile#SOFTBANK** (alias: UTF-8-SOFTBANK)
- ISO-2022-JP-MOBILE#KDDI** (alias: ISO-2022-JP-KDDI)
- JIS
- JIS-ms
- CP50220
- CP50220raw
- CP50221
- CP50222
- ISO-8859-1*
- ISO-8859-2*
- ISO-8859-3*
- ISO-8859-4*
- ISO-8859-5*
- ISO-8859-6*
- ISO-8859-7*
- ISO-8859-8*
- ISO-8859-9*
- ISO-8859-10*
- ISO-8859-13*
- ISO-8859-14*
- ISO-8859-15*
- ISO-8859-16*
- byte2be
- byte2le
- byte4be
- byte4le
- BASE64
- HTML-ENTITIES (alias: HTML)
- 7bit
- 8bit
- EUC-CN*
- CP936
- GB18030**
- HZ
- EUC-TW*
- CP950
- BIG-5*
- EUC-KR*
- UHC (alias: CP949)
- ISO-2022-KR
- Windows-1251 (alias: CP1251)
- Windows-1252 (alias: CP1252)
- CP866 (alias: IBM866)
- KOI8-R*
- KOI8-U*
- ArmSCII-8 (alias: ArmSCII8)
* обозначает кодировки, которые также могут использоваться в регулярных выражениях.
** обозначает кодировки, доступные с PHP 5.4.0.
Любая запись в php.ini , которая принимает имя кодировки, может также использовать значения » auto » и » pass «. Функции mbstring , которые принимают имя кодировки, также могут использовать значение » auto «.
Если установлено значение » pass «, преобразование кодировки не производится.
Если установлено значение » auto «, оно расширяется списком кодировок, определённым в NLS (настройках национального языка). Например, если NLS установлен в Japanese , предполагается, что значение будет из списка » ASCII,JIS,UTF-8,EUC-JP,SJIS «.