PHP从utf8_general_ci转换为latin1_swedish_ci

时间:2015-06-29 01:33:29

标签: php string preg-replace str-replace mb-convert-encoding

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

在进入数据库的过程中,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序列代表一些特殊的字符串,在字符串之间需要转换为它们的实际值:

编码字符串: 候选人\ u00e \ u0080 \ u0099个人情况

序列\ 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不支持\ L,\ l,\ N {name},\ U或\ u在偏移量1

我尝试了几个选项,但是当我开始强迫这个问题出现在我脑海中的三个选项时,我无法弄清楚为什么那些函数特别是str_replace无法以预期的方式工作。

1 个答案:

答案 0 :(得分:1)

我终于解决了这个问题。只是想让有人在同一个问题上挣扎。 对我有用的解决方案发布在

I have a string with "\u00a0", and I need to replace it with "" str_replace fails

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;
    }