Почему кавычки превращаются в забавные символы при отправке в форме HTML?
У меня есть HTML-форма, и некоторые пользователи копируют / вставляют текст из MS Word. Когда есть одинарные или двойные кавычки, они переводятся в забавные символы, такие как:
'™ и' ™
Столбец базы данных - это сопоставление utf8_general_ci.
Как мне найти подходящих персонажей?
Изменить: проблема решена. Вот как я это исправил:
Ран mysql_query("SET NAMES 'utf8'");
перед добавлением / извлечением из базы данных. (спасибо комментарию Донала ниже).
И несколько странно, функция PHP urlencode($text)
был применен при отображении, так что пришлось удалить.
Я также позаботился о том, чтобы заголовки страницы и запрос / ответ ajax были все utf8.
3 ответа
Это похоже на классический случай символов Unicode (скорее всего, UTF-8), интерпретируемых как iso-8859-1. По пути есть пара мест, где персонажи могут испортиться. Во-первых, браузер клиента должен отправить данные. Он может повредить данные, если не сможет правильно преобразовать символы в кодировку страницы. Затем сервер считывает данные и декодирует байты в символы. Если клиент и сервер расходятся во мнениях относительно используемой кодировки, символы будут повреждены. Затем данные хранятся в базе данных; снова есть потенциал для коррупции. Наконец, когда данные записываются на странице (для отображения в браузере), браузер может неверно интерпретировать байты, если страница недостаточно указывает на ее кодировку.
Вы должны убедиться, что вы используете UTF-8 повсюду. По умолчанию для веб-страниц iso-8859-1, поэтому ваши веб-страницы должны обслуживаться с заголовком Content-Type или метатегом.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(убедитесь, что вы действительно используете текст в этой кодировке).
Используя UTF-8 во всех частях процесса, вы избежите проблем со всеми работающими веб-браузерами и базами данных.
Проверьте кодировку, которую использует страница. Закодируйте его также с использованием UTF-8 и добавьте метатег, описывающий кодировку:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
У нас есть функция PHP, которая пытается убрать беспорядок с помощью умных кавычек. Это немного беспорядок, так как он вырос немного органично, так как случаи возникали во время разработки прототипа. Это может помочь, хотя:
function convert_smart_quotes($string) {
$search = array(chr(0xe2) . chr(0x80) . chr(0x98),
chr(0xe2) . chr(0x80) . chr(0x99),
chr(0xe2) . chr(0x80) . chr(0x9c),
chr(0xe2) . chr(0x80) . chr(0x9d),
chr(0xe2) . chr(0x80) . chr(0x93),
chr(0xe2) . chr(0x80) . chr(0x94),
chr(226) . chr(128) . chr(153),
'’','“','â€<9d>','â€"',' ');
$replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' ');
return str_replace($search, $replace, $string);
}