来自Word粘贴的Textarea输入在MySQL中存储为无意义

时间:2014-12-01 06:32:55

标签: php mysql encoding utf-8 ms-word

我已经尝试过找到这个问题的答案了,我觉得它与编码有关,但经过多次尝试后我没想到会在这里提问。对不起,如果它是重复的。

我有一个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中提到),它设法替换有问题的字符串,但不加区别地用问号代替原始文件。

我觉得我在黑暗中徘徊,并会感激任何指针!

1 个答案:

答案 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);

来自:https://stackoverflow.com/a/6219023/1857295