我从网站上收到大量数据,所有这些字符串值都需要添加到我们的数据库中。
在进入数据库的过程中,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无法以预期的方式工作。
答案 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;
}