我已经尝试过找到这个问题的答案了,我觉得它与编码有关,但经过多次尝试后我没想到会在这里提问。对不起,如果它是重复的。
我有一个textarea输入字段存储在MySQL文本列中。当文本直接输入textarea时,它存储并显示正常。当它输入Word然后复制粘贴(我的用户坚持做的事情)时,它会将撇号和双引号转换为:
' is displayed as ’
" is displayed as “
" is displayed as â€
但是,我确定这是一个编码问题,因为如果我从命令行发出我的select语句,它显示正常。只有当我通过网络(phpMyAdmin或通过我的实际应用程序)查看数据时才会出现问题。
我试过了:
$output = str_replace("’","'",$input);
和
$output = str_replace("\â\€\™","\'",$input);
等。但没有效果。我下载了Encoding :: toUTF8(在Detect encoding and make everything UTF-8中提到),它设法替换有问题的字符串,但不加区别地用问号代替原始文件。
我觉得我在黑暗中徘徊,并会感激任何指针!
答案 0 :(得分:0)
实际上问题不是在PHP中发生,而是在JavaScript中发生,这是由于从Word复制/粘贴,因此您需要在将文本传递给PHP之前用JavaScript解决问题:
// 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);