Я попытался найти ответ на этот вопрос, и у меня есть чувство, что это связано с кодированием, но безуспешно, после многих попыток, я подумал спросить здесь. Извините, если это дубликат.
У меня есть поле ввода textarea, хранящееся в текстовом столбце MySQL. Когда текст вводится непосредственно в текстовую область, он сохраняется и отображается нормально. Когда он набирается в Word, а затем копируется и вставляется (то, на чем настаивают мои пользователи), он превращает апострофы и двойные кавычки в это:
' is displayed as ’
" is displayed as “
" is displayed as â€
Тем не менее, я уверен, что это проблема кодирования при выходе, потому что, если я выдаю свои операторы select из командной строки, он отображается нормально. Только если я смотрю на данные через веб (phpMyAdmin или через мое реальное приложение), они искажаются.
Я попробовал это:
$output = str_replace("’","'",$input);
а также
$output = str_replace("\â\€\™","\'",$input);
и т.д. Но никакого эффекта. Я скачал Encoding :: toUTF8 (упоминается в Определите кодировку и сделайте все в UTF-8), и ему удается заменить проблемные строки, но без разбора на вопросительные знаки вместо оригиналов.
Я чувствую, что я слоняюсь в темноте и буду благодарен за любые указатели!
На самом деле проблема не возникает в PHP, но происходит в JavaScript, это происходит из-за копирования / вставки из Word, поэтому вам нужно решить свою проблему в JavaScript, прежде чем передавать текст в PHP:
// Replaces commonly-used Windows 1252 encoded chars that do not exist in ASCII or ISO-8859-1 with ISO-8859-1 cognates.
var replaceWordChars = function(text) {
var s = text;
// smart single quotes and apostrophe
s = s.replace(/[\u2018|\u2019|\u201A]/g, "\'");
// smart double quotes
s = s.replace(/[\u201C|\u201D|\u201E]/g, "\"");
// ellipsis
s = s.replace(/\u2026/g, "...");
// dashes
s = s.replace(/[\u2013|\u2014]/g, "-");
// circumflex
s = s.replace(/\u02C6/g, "^");
// open angle bracket
s = s.replace(/\u2039/g, "<");
// close angle bracket
s = s.replace(/\u203A/g, ">");
// spaces
s = s.replace(/[\u02DC|\u00A0]/g, " ");
return s;
}
//Use like:
var newText = replaceWordChars(textToCheck);
Других решений пока нет …