2009-09-28 3 views
13

У меня есть HTML-форма, а некоторые пользователи копируют/вставляют текст из MS Word. Когда есть одиночные кавычки или двойные кавычки, они переводятся в забавные символы, такие как:Почему цитаты превращаются в забавные персонажи при отправке в HTML-форме?

«Â € Â ™ и Ã ¢ Â € Â ™

Столбец базы данных сверки utf8_general_ci.

Как получить соответствующие символы для отображения?

Редактировать: Проблема решена. Вот как я его исправил:

Ran mysql_query("SET NAMES 'utf8'"); перед добавлением/возвратом из базы данных. (благодаря комментарию Донала ниже).

И несколько нечетный, при отображении была применена функция php urlencode($text), поэтому ее необходимо было удалить.

Я также удостоверился, что заголовки для страницы и запрос/ответ ajax были все utf8.

+4

MS Word меняет котировки на «умные кавычки», которые ничего, кроме умных. Они используют «кодовую страницу» Microsoft вместо Unicode. –

+0

Вы также заметите это с некоторыми дефисами. – Buggabill

+1

Если все кодировки указаны правильно, они должны быть автоматически преобразованы в их эквивалент Unicode. Я сомневаюсь, что проблема специфична для Word; попробуйте ввести, например. Alt + 130 (é), и посмотрите, получилось ли это чисто. – Thomas

ответ

21

Это выглядит как классический случай 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 по всем частям процесса, вы избежите проблем со всеми работающими веб-браузерами и базами данных.

+1

+1, нет никаких локальных исправлений для этих проблем, важно то, что вы должны знать о кодировании везде, где вы передаете или сохраняете текст. – 2009-09-28 20:51:29

+0

Да, я согласен с @ user8599 .... – omega

5

Проверьте кодировку, которую использует страница. Закодировать его с помощью UTF-8, а также, и добавить мета-тег, описывающий кодировку:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
4

У нас есть функция 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); 
} 
+4

Я сделал это сам, но я думаю, что это плохая идея. Если у вас есть текстовый процесс или какой-либо другой процесс, который развращает ваши данные, исправьте процесс, чтобы он не исказил данные, не просто делайте поэтапные исправления на выходе. – 2009-09-28 21:13:33

+0

Да - полвека спустя. Я наткнулся на это, поскольку я поддерживал существующий код. Я знал о проблемах с вырезанием/вставкой из таких программ, как Word, но для резервного копирования @ mike-a на нем, иногда вы не можете контролировать источник информации, и вам необходимо принять нормализационный подход к потоку данных. Я использовал это, и добавил еще один для â € ¢ (пули первого уровня, которые у меня были). –

Смежные вопросы