所以我遇到了一个问题,我认为发生的事情是我接收到的数据使用了一些unicode空间和一些ascii空间,因此某些看起来相同的字符串是不等价的,例如"防水"!="防水"。然而,这些字符串在我的数据库中出现的方式不同,当有多字节字符时,你通常会看到一些奇怪的字符:"防水"answers"防水"。
我想要一种方法,使所有的空间都是ascii空间,或者如果更容易的话,所有的空间是多字节空间。
我尝试过使用preg_replace,但字符串的读取方式不再像有效的多字节字符串。(字符串中的多字节字符将显示为垃圾)。
preg_replace('/['pZ'pC]/',' ',$field);
我也尝试过使用mb_ereg_replace,但没有效果。
mb_ereg_replace('/['pZ'pC]/',' ',$field)
如果需要,您可以通过:找到并用标准ascii空格替换它们
$string = str_replace("'xc2'xa0", "'x20", $string);
看起来preg_replace('/['pZ'pC]/u',' ',$field);
可以工作(忘记了正则表达式末尾的u)
我想您正在寻找utf8_decode($field)
。
那些称为unicode空间的空间是非中断空间(代表什么)。
保存数据时,必须先清理数据。用普通空格替换所有不间断空格,用单个空格替换双空格,最后修剪字符串。