Почему кавычки превращаются в забавные символы при отправке в форме 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);
}
Другие вопросы по тегам