У меня возникают проблемы с 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 в руководстве .
Позднее оживление. Но для дальнейших ссылок здесь приведены некоторые дополнительные советы:
SET xxx
Установите заголовки:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Я просто столкнулся с этой проблемой. У меня есть содержание всего веб-сайта на испанском языке, со всеми специальными персонажами, которые вы можете ожидать (по-прежнему) и с их версиями заглавных букв.
В моем случае это была несогласованность с кодировкой / сопоставлением сервера. Все остальное было установлено на utf8, но на сервере charset, который имел latin1. Это привело к тому, что все данные utf8, введенные в базу данных, отображались в своей необработанной кодированной форме, например, L í равнялся бы A с тильдой ~ …
Я использую mysqli, и, чтобы исправить это, я использовал метод, описанный выше Энтони Аксоли (используя mysql_set_charset). Указанный метод имеет версию mysqli, и это то, что я использовал.
После этого я был озадачен. У меня все еще был беспорядок при просмотре моего веб-сайта. Конечно, я не знал, что, изменив этот latin1 на utf8, я также испортил кодировку / декодирование всего этого. Поэтому я использовал помощь онлайн-кодировщика / декодера строки, чтобы исправить мои данные таблицы.
Я сделал различные экспортные данные всех моих данных контента (вы можете настроить их для получения запросов на обновление и которые будут быстрее для вашего процесса обновления) и запустить SQL-вывод через вышеупомянутый онлайн-кодер / декодер, а затем скопировать вставленные фиксированные запросы на phpmyadmin sql panel … таким образом, фиксируя ошибки в кодировке. Теперь все так, как должно быть, И я снова могу обрабатывать поиски с потерями: Мария, мария, мария, мариа будут соответствовать марии, марии, Марии и т. Д. Все острые персонажи оценивают свой базовый гласный характер. Эпическая победа.