0

我从网站接收大量数据,所有这些字符串值都需要添加到我们的数据库中。

在插入数据库期间 SQL 有时会抛出以下错误:

Warning:  PDOStatement::execute(): SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)

数据库表实际上设置为使用 Latin1。

用 json_encode() 对我的值进行编码后,我发现了这个错误发生的原因。表示字符串之间的一些特殊字符的 UTF 序列需要转换为它们的实际值:

编码字符串:candidate\u00e2\u0080\u0099s 个人情况

在本例中,序列 \u00e2\u0080\u0099 表示一个 '。

无论只有几个不同的序列,我也知道我想要/需要替换它们的值,但我正在努力转换。

我尝试了几种方法,但都没有成功,

使用 str_replace:

str_replace('\\u00e2\\u0080\\u0099', '\'', ($string));

没有改变字符串中的任何内容

使用 mb_functions:

$encodedStr = mb_convert_encoding($string, 'ASCII')

给我留下了一些神秘的东西??而不是 UTF 序列,但它不会引发数据库错误,但它仍然不是我需要的。

使用 preg_replace:

preg_replace('/\\u00e2\\u0080\\u0099/', '\'', $string)


抛出错误:PCRE 在偏移量 1 处不支持 \L、\l、\N{name}、\U 或 \u

我已经尝试了更多选项,但是当我开始强迫这个问题时,我想到了三个选项,我只是无法弄清楚为什么这些功能,特别是 str_replace 不能以预期的方式工作。

4

1 回答 1

1

我终于解决了这个问题。以防有人在同样的问题上挣扎。对我有用的解决方案发布在

我有一个带有“\u00a0”的字符串,我需要用“”替换它 str_replace 失败

private function convert($string) {
    /* Strings to remove:    
     *      \u00a0 = 
     *      \u00e2\u0080\u0099 = '
     *      
     */
    $string = str_replace(chr(194).chr(160), '', $string);  //removes \u00a0
    $string = str_replace('â', '', $string);  //removes \u00e2
    $string = str_replace(chr(194).chr(128).chr(194).chr(153), '\'', $string);  //removes \u0080\u0099

    return $string;
    }
于 2015-06-29T23:44:03.357 回答