Почему цитаты превращаются в забавные персонажи при отправке в HTML-форму?
У меня есть HTML-форма, и некоторые пользователи копируют/вставляют текст из MS Word. Когда есть одинарные кавычки или двойные кавычки, они переводятся на забавные символы, такие как:
'Â € Â ™ и Ã ¢ Â € Â ™
Столбец базы данных - это сортировка utf8_general_ci.
Как получить соответствующие символы для отображения?
Edit:
Задача решена. Вот как я его исправил:
Ran mysql_query("SET NAMES 'utf8'");
перед добавлением/возвратом из базы данных. (спасибо комментарию Донала ниже).
И несколько странно, при отображении применялась функция php urlencode($text)
, поэтому ее нужно было удалить.
Я также убедился, что заголовки для страницы и запрос/ответ ajax были все utf8.
Ответы
Ответ 1
Это выглядит как классический случай символов юникода (скорее всего, 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 по всем частям процесса, вы избежите проблем со всеми работающими веб-браузерами и базами данных.
Ответ 2
Проверьте кодировку, используемую страницей. Кодируйте его также с помощью UTF-8 и добавьте метатег, описывающий кодировку:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Ответ 3
У нас есть функция 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);
}