PHP / MySQL с проблемами кодирования

У меня возникают проблемы с PHP в отношении кодирования.

У меня есть страница JavaScript HTML / jQuery HTML5, взаимодействующая с моим PHP-скриптом с использованием $ .post. Однако PHP сталкивается со странной проблемой, вероятно, связанной с кодировкой.

Когда я пишу

htmlentities("í") 

Я ожидаю PHP для вывода í , Однако вместо этого он выводит í Вначале я думал, что ошибаюсь в кодировках, однако

 htmlentities("í")=="í"?"Good":"Fail"; 

выводит «Fail», где

 htmlentities("í")=="í"?"Good":"Fail"; 

Но htmlentities($search, null, "utf-8") работает так, как ожидалось.

Я хочу, чтобы PHP взаимодействовал с сервером MySQL, но он также имеет проблемы с кодировкой, даже если я использую utf8_encode. Что мне делать?

EDIT: в команде SQL, написав

 SELECT id,uid,type,value FROM users,profile WHERE uid=id AND type='name' AND value='XXX'; 

где XXX не содержит символов, работает, как ожидалось, но это не так, если есть какой-либо символ.

 SET NAMES 'utf8'; SET CHARACTER SET 'utf8'; SELECT id,uid,type,value FROM users,profile WHERE uid=id AND type='name' AND value='XXX'; 

Не только терпит неудачу для í символов, но он также не работает для строк без каких-либо специальных символов. Удаление «символов из SET NAMES и SET CHARACTER SET», похоже, ничего не меняет.

Я подключаюсь к базе данных MySQL, используя PDO.

EDIT 2: Я использую MySQL версии 5.1.30 XAMPP для Linux.

EDIT 3: Выполнение SHOW VARIABLES LIKE '%character%' из выходов PhpMyAdmin

 character_set_client utf8 character_set_connection utf8 character_set_database latin1 character_set_filesystem binary character_set_results utf8 character_set_server latin1 character_set_system utf8 character_sets_dir /opt/lampp/share/mysql/charsets/ 

Выполнение того же запроса из моего сценария PHP (с помощью print_r):

 Array ( [0] => Array ( [Variable_name] => character_set_client [0] => character_set_client [Value] => latin1 [1] => latin1 ) [1] => Array ( [Variable_name] => character_set_connection [0] => character_set_connection [Value] => latin1 [1] => latin1 ) [2] => Array ( [Variable_name] => character_set_database [0] => character_set_database [Value] => latin1 [1] => latin1 ) [3] => Array ( [Variable_name] => character_set_filesystem [0] => character_set_filesystem [Value] => binary [1] => binary ) [4] => Array ( [Variable_name] => character_set_results [0] => character_set_results [Value] => latin1 [1] => latin1 ) [5] => Array ( [Variable_name] => character_set_server [0] => character_set_server [Value] => latin1 [1] => latin1 ) [6] => Array ( [Variable_name] => character_set_system [0] => character_set_system [Value] => utf8 [1] => utf8 ) [7] => Array ( [Variable_name] => character_sets_dir [0] => character_sets_dir [Value] => /opt/lampp/share/mysql/charsets/ [1] => /opt/lampp/share/mysql/charsets/ ) ) 

Бег

 SET NAMES 'utf8'; SET CHARACTER SET 'utf8'; SHOW VARIABLES LIKE '%character%' 

выводит пустой массив.

Очень важно указать кодировку htmlentities, соответствующую кодировке ввода, как это было в вашем последнем примере, но пропущено в первых трех.

 htmlentities($text,ENT_COMPAT,'utf-8'); 

Что касается связи с MySQL, вам необходимо убедиться, что сопоставление соединений и набор символов соответствуют данным, которые вы передаете. Вы можете либо установить это в файле конфигурации, либо во время выполнения, используя следующие запросы:

 SET NAMES utf8; SET CHARACTER SET utf8; 

Убедитесь, что набор символов таблицы, базы данных и сервера совпадает. Существует одна настройка, которую вы не можете изменить во время выполнения, и это набор символов сервера. Вам необходимо изменить его в файле конфигурации:

 [mysqld] character-set-server = utf8 default-character-set = utf8 skip-character-set-client-handshake 

Подробнее о наборах символов и сопоставлениях в MySQL в руководстве .

Позднее оживление. Но для дальнейших ссылок здесь приведены некоторые дополнительные советы:

  1. Используйте mysql_set_charset вместо SET xxx
  2. Убедитесь, что вы сохраняете файл с кодировкой UTF-8 (это часто игнорируется)
  3. Установите заголовки:
    <?php header("Content-type: text/html; charset=utf-8"); ?>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  4. Если ваша конфигурация сервера Apache содержит директиву AddDefaultCharset с другой кодировкой, орать администратору хоста.

Я просто столкнулся с этой проблемой. У меня есть содержание всего веб-сайта на испанском языке, со всеми специальными персонажами, которые вы можете ожидать (по-прежнему) и с их версиями заглавных букв.

В моем случае это была несогласованность с кодировкой / сопоставлением сервера. Все остальное было установлено на utf8, но на сервере charset, который имел latin1. Это привело к тому, что все данные utf8, введенные в базу данных, отображались в своей необработанной кодированной форме, например, L í равнялся бы A с тильдой ~ …

Я использую mysqli, и, чтобы исправить это, я использовал метод, описанный выше Энтони Аксоли (используя mysql_set_charset). Указанный метод имеет версию mysqli, и это то, что я использовал.

После этого я был озадачен. У меня все еще был беспорядок при просмотре моего веб-сайта. Конечно, я не знал, что, изменив этот latin1 на utf8, я также испортил кодировку / декодирование всего этого. Поэтому я использовал помощь онлайн-кодировщика / декодера строки, чтобы исправить мои данные таблицы.

Я сделал различные экспортные данные всех моих данных контента (вы можете настроить их для получения запросов на обновление и которые будут быстрее для вашего процесса обновления) и запустить SQL-вывод через вышеупомянутый онлайн-кодер / декодер, а затем скопировать вставленные фиксированные запросы на phpmyadmin sql panel … таким образом, фиксируя ошибки в кодировке. Теперь все так, как должно быть, И я снова могу обрабатывать поиски с потерями: Мария, мария, мария, мариа будут соответствовать марии, марии, Марии и т. Д. Все острые персонажи оценивают свой базовый гласный характер. Эпическая победа.