Вам нужен UTF-8, чтобы умные кавычки и тире («» -) и другие символы не ASCII работали надежно:
(1) Убедитесь, что браузер отправляет вам символы, закодированные в UTF-8. Сделайте это, объявив страницу с формой UTF-8:
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
...
(Игнорировать <form accept-encoding>
, который не работает в IE.)
(2) PHP имеет дело с необработанными байтами и не заботится о том, в какой кодировке они находятся, но база данных заботится, поэтому вы должны указать, какая кодировка поступает из PHP. Вот что SET NAMES
делает, хотя mysql_set_charset может быть предпочтительнее.
(3) Как только нужные символы достигнут базы данных, их нужно будет сохранить в кодировке Unicode, чтобы убедиться, что все символы могут поместиться. Каждый столбец может иметь различную кодировку, но вы можете использовать DEFAULT CHARACTER SET utf8
, когда CREATE table
, чтобы все текстовые столбцы в нем использовали UTF-8. Вы также можете установить набор символов по умолчанию для базы данных или всего сервера на utf8
, если хотите.
Если у вас уже есть CREATE
d таблиц и они сопоставлены не в UTF-8, вам придется воссоздать или изменить таблицы. Вы можете проверить текущую сортировку, используя SHOW FULL COLUMNS FROM sometable;
.
(4) Убедитесь, что вы HTML-кодируете текст, который вы выводите из PHP, используя htmlspecialchars()
, а не htmlentities()
, что по умолчанию будет путать не-ASCII символы.
[В качестве альтернативы (2) и (3) вы можете просто использовать кодировку Latin-1 по умолчанию для соединения и хранения таблицы, но тем не менее поместить в нее байты UTF-8. Недостаток этого подхода заключается в том, что он будет выглядеть неправильно для других инструментов, рассматривающих базу данных, и символы нижнего и верхнего регистров не будут сравниваться друг с другом ожидаемым образом без учета регистра.]