Я переместил приложение php на новый сервер. Я использую mysql5 db. Когда я обновляю или вставляю что-то в db, каждый знак "
и» заменяется на ?
Я использую SET NAMES UTF8
и SET CHARACTER SET
но он не работает. Любые идеи?
SET NAMES UTF8
следует использовать на каждой странице при выборе, а также при обновлении или вставке.
на самом деле этот запрос должен использоваться каждый раз, когда вы подключаетесь к базе данных. просто добавьте его для подключения кода.
Вам нужен 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-кода вы htmlspecialchars()
из PHP с помощью htmlspecialchars()
а не htmlentities()
, который по умолчанию будет испортить не-ASCII-символы.
[В качестве альтернативы (2) и (3) вы можете использовать кодировку Latin-1 по умолчанию для соединения и хранилища таблиц, но, тем не менее, помещать в нее байты UTF-8. Недостатком такого подхода является то, что он будет выглядеть не так, как другие инструменты, смотрящие на базу данных, а символы нижнего / верхнего регистра не будут сравниваться друг с другом в ожидаемом случае без учета регистра.]
Я предполагаю, что вы вставляете из какого-то текстового редактора, который преобразует "
в угловую симпатичную цитату и преобразует ваш» в mdash, что заставляет отображать как «.».
Хотя вы настроили базу данных для приема символов UTF8, вы, вероятно, не указали свой веб-сервер / PHP для принятия этих символов. Попробуйте сыграть с функциями mbstring
, но убедитесь, что вы используете arent, используя скошенные котировки или тире.