Часто бывает, что такие символы, как é, преобразуются в Ã ©, даже если сопоставление для базы данных MySQL, таблицы и поля установлено на utf8_general_ci. Кодировка в Тип содержимого для страницы также установлена на UTF8.
Я знаю об utf8_encode / decode, но не совсем уверен, где и как его использовать.
Я прочитал статью «Абсолютный минимум. Каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)», но мне нужны некоторые специфические указатели MySQL / PHP.
Вопрос: Как убедиться, что введенные пользователем данные, содержащие международные символы, не будут повреждены?






При первом взгляде на http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet я думаю, что упускается одна важная вещь (возможно, я упустил из виду это). В зависимости от вашей установки и / или конфигурации MySQL вы должны установить кодировку соединения, чтобы MySQL знал, какую кодировку вы ожидаете на стороне клиента (имеется в виду клиентская сторона соединения MySQL, которым должен быть скрипт PHP). Вы можете сделать это вручную, выполнив
SET NAMES utf8
запрос перед любым другим запросом, который вы отправляете на сервер MySQL.
Если вы используете PDO на стороне PHP, вы можете настроить соединение для автоматической выдачи этого запроса при каждом (повторном) подключении, используя
$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");
при инициализации соединения с БД.
Для всех, кто только что читал это (по состоянию на март 2010 г.), ссылка на статью теперь доступна по адресу developer.loftdigital.com/blog/php-utf-8-cheatsheet.
Для лучшей корректности юникода вы должны использовать utf8_unicode_ci (хотя документация немного расплывчата относительно различий). Вы также должны убедиться, что следующие флаги Mysql установлены правильно:
Их можно установить в файле конфигурации mysql (на вкладке [mysqld]) или во время выполнения, отправив соответствующие запросы.
Что вам следует делать:
header(), чтобы сделать это вручную.SET NAMES utf8 делает свое дело.Когда вы делаете это, обычно вам не нужно слишком много делать с помощью функций mb_string или utf8_encode/decode.
Сопоставление и кодировка - это не одно и то же. Ваша сортировка должна соответствовать кодировке, поэтому, если ваша кодировка - utf-8, то и сортировка должна соответствовать. Однако выбор неправильного сопоставления не приведет к искажению ваших данных - просто сделайте так, чтобы сравнение / сортировка строк работало неправильно.
Тем не менее, есть несколько мест, где вы можете установить настройки кодировки в PHP. Я бы рекомендовал вам по возможности использовать utf-8. Места, для которых требуется указать кодировку:
Content-Type указан utf-8. Вы можете установить значения по умолчанию в PHP и Apache, или вы можете использовать функцию PHP header.accept-charset. Также убедитесь, что URL-адреса имеют кодировку utf-8, или избегайте использования символов, отличных от ascii, в URL-адресах (и параметрах GET).Функции utf8_encode / decode имеют несколько странное название. Они специально конвертируют между latin1 (ISO-8859-1) и utf-8. Если все в вашем приложении - это utf-8, вам не придется их часто использовать.
В отношении utf-8 и PHP есть как минимум две ошибки. Во-первых, встроенные строковые функции PHP ожидают, что строки будут однобайтовыми. Для многих операций это не имеет значения, но это означает, что вы не можете полагаться на strlen и другие функции. Есть хорошее исчерпание ограничений на эта страница. Обычно это не большая проблема, но особенно при использовании сторонних библиотек вы должны знать, что это может взорваться. Один из вариантов - также использовать расширение mb_string, которое позволяет заменять все вызывающие проблемы функции альтернативами, поддерживающими utf-8. Это все еще не 100% пуленепробиваемое решение, но оно будет работать в большинстве случаев.
Другая проблема заключается в том, что в некоторых установках PHP все еще включен параметр magic_quotes. Эта проблема ортогональна UTF-8, но может привести к некоторому чесанию головы. Выключите его, ради вашего здравомыслия.
Независимо от языка, на котором оно написано, если вы создадите приложение, допускающее широкий спектр кодировок, обрабатывайте его по частям:
Об этом где-то упоминается в комментариях, но да, это сложно пропустить!