Почему меняется мой выход?

Я работаю с кодировкой UTF-8 в PHP, и я продолжаю управлять выходом так же, как и хочу. И тогда, ничего не происходит с кодом, результат внезапно меняется.

Раньше я получал иврит. Теперь я получаю «&&&&&».

Любые идеи, что может быть причиной этого?

Это наиболее распространенные проблемы:

  • Ваш редактор, создающий файлы PHP / HTML в
  • Веб-браузер, который вы просматриваете на своем сайте через
  • Ваше веб-приложение PHP, работающее на веб-сервере
  • База данных MySQL
  • В любом другом месте, где вы читаете / записываете данные (memcached, API, RSS-каналы и т. Д.),

И несколько вещей, которые вы можете попробовать:

Настройка редактора

Убедитесь, что ваш текстовый редактор, IDE или все, что вы пишете PHP-код, сохраняет файлы в формате UTF-8. Для вашего FTP-клиента, scp, SFTP-клиента не требуется никаких специальных настроек UTF-8.

Убедитесь, что веб-браузеры знают, как использовать UTF-8

Чтобы все браузеры ваших пользователей знали, что нужно читать / записывать все данные в формате UTF-8, вы можете установить это в двух местах.

Тег типа контента

Убедитесь, что заголовок META типа контента указывает UTF-8 как набор символов, подобный этому:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> 

Заголовки ответа HTTP

Убедитесь, что заголовок ответа Content-Type также указывает UTF-8 как набор символов следующим образом:

 ini_set('default_charset', 'utf-8') 

Настройка соединения MySQL

Теперь вы знаете, что все данные, которые вы получаете от пользователей, находятся в формате UTF-8, нам нужно настроить клиентское соединение между PHP и базой данных MySQL. Существует общий способ сделать, просто выполнив запрос MySQL:

 SET NAMES utf8; 

… и в зависимости от того, какой клиент / драйвер вы используете, есть вспомогательные функции, чтобы сделать это проще:

Со встроенными функциями mysql

 mysql_set_charset('utf8', $link); 

С MySQLi

 $mysqli->set_charset("utf8") 

* С PDO_MySQL (при подключении) *

 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 

База данных MySQL

Сейчас мы почти все, вам просто нужно убедиться, что MySQL знает, как хранить данные в ваших таблицах как UTF-8. Вы можете проверить их кодировку, посмотрев значение Collation на выходе SHOW TABLE STATUS (в phpmyadmin это показано в списке таблиц). Если ваши таблицы еще не находятся в UTF-8 (вероятно, они находятся в latin1), вам нужно будет их преобразовать, выполнив следующую команду для каждой таблицы:

 ALTER TABLE myTable CHARACTER SET utf8 COLLATE utf8_general_ci; 

Последнее, что нужно следить за

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

Взято здесь: http://webmonkeyuk.wordpress.com/2011/04/23/how-to-avoid-character-encoding-problems-in-php/

Попробуйте установить тип содержимого с header следующим образом:

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

Попробуйте эту функцию ->

 $html = "Bla Bla Bla..."; $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); 

для более – http://php.net/manual/en/function.mb-convert-encoding.php

Я собрал этот метод и назвал его в файле, с которым я работаю, и это, похоже, решило проблему.

 function setutf_8() { header('content-type: text/html; charset: utf-8'); mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); mb_http_input('UTF-8'); mb_language('uni'); mb_regex_encoding('UTF-8'); ob_start('mb_output_handler'); } 

Спасибо за твою помощь! 🙂