PHP将unicode空间转换为ascii空间

PHP将unicode空间转换为ascii空间,php,unicode,mbstring,Php,Unicode,Mbstring,因此,我遇到了一个问题,我认为正在发生的是,我接收到的数据使用了一些unicode空格和一些ascii空格,因此某些看起来相同的字符串是不等价的,例如,“防水”!=“防水”。然而,在我的数据库中,这些字符串的显示方式不同,当有一个多字节字符时,您通常会看到奇怪的字符:“防水”和“防水” 我想要一种方法,使所有的空间都是ascii空间,或者如果更简单,所有的空间都是多字节空间 我尝试过使用preg_replace,但是字符串不再像有效的多字节字符串那样读取。(字符串中的多字节字符将显示为垃圾) 我

因此,我遇到了一个问题,我认为正在发生的是,我接收到的数据使用了一些unicode空格和一些ascii空格,因此某些看起来相同的字符串是不等价的,例如,“防水”!=“防水”。然而,在我的数据库中,这些字符串的显示方式不同,当有一个多字节字符时,您通常会看到奇怪的字符:“防水”和“防水”

我想要一种方法,使所有的空间都是ascii空间,或者如果更简单,所有的空间都是多字节空间

我尝试过使用preg_replace,但是字符串不再像有效的多字节字符串那样读取。(字符串中的多字节字符将显示为垃圾)

我也尝试过使用mb_ereg_替换,但没有效果

mb_ereg_replace('/[\pZ\pC]/',' ',$field)

我想您正在寻找。

它看起来像是
preg\u replace('/[\pZ\pC]/u',''.$field)
有效(忘记了正则表达式末尾的u)

您称之为unicode空格的那些空格是非中断空格(它代表什么)


保存数据时,必须先清理数据。用普通空格替换所有不间断空格,用单空格替换双空格,最后修剪字符串

如果需要,您可以通过以下方式查找并替换为标准ascii空格:

$string = str_replace("\xc2\xa0", "\x20", $string);

同意-这适用于我的数据库的ISO-8859-1到UTF-8。如果我调用utf8_decode($field),该字段在网页上显示时仍将显示垃圾字符。在保存到数据库之前,我还需要修复空间问题,因为否则它将存储各种“白色”空间的“防水”副本,而不仅仅是单个条目“防水”。我认为这个解决方案是最好的——简单而实用。在我的WordPress content_save_pre()过滤器中为我工作,以消除不间断空格,用户在他们使用的任何内容编辑器(如Word)中键入两个连续空格,从而将其中一个空格转换为不间断空格以保留2个空格。因为我们不使用打字机,所以使用2-space是荒谬的——此外,它是浏览器中的类型流地狱这对我不起作用,但@Kai的答案确实起作用。这对我起作用,但请注意,它似乎比预期的更具侵略性。提供的正则表达式还匹配“标准”ASCII空间。因此,如果您试图仅替换Unicode不间断空格(例如,使用非空格字符),这将替换比您预期更多的字符。
$string = str_replace("\xc2\xa0", "\x20", $string);