PHP将Unicode空格转换为ASCII空格

6

我遇到一个问题,我认为原因是我收到了一些使用unicode空格和ascii空格的数据。这导致某些看起来相同的字符串并不等同,例如 "water resistant" != "water resistant"。这些字符串在我的数据库中呈现不同,使用了一些奇怪的字符,通常在出现多字节字符时可以看到:"water resistantÂ" 和 " water resistant"。

我想找到一种方法,使所有的空格都成为ascii空格,或者更容易的办法是将所有的空格变成多字节空格。

我尝试使用preg_replace,但这样字符串就不能被识别为有效的多字节字符串了(多字节字符会显示为垃圾字符)。

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

我也尝试过使用mb_ereg_replace,但没有效果。

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

https://dev59.com/0HI_5IYBdhLWcg3wK_s6 - marekful
4个回答

9

如果你想要,可以通过以下方式找到并替换它们为标准 ASCII 空格:

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

我认为这个解决方案是最好的——简单而实用。在我的WordPress content_save_pre()过滤器中,它对我起到了作用,可以消除用户在任何内容编辑器(如Word)中键入两个连续空格时产生的非断行空格——这会将其中一个空格转换为非断行空格以保留2个空格。由于我们不使用打字机,所以2个空格是荒谬的——此外,在浏览器中排版也很麻烦。 - aequalsb
这对我没用,但是@Kai的回答确实有效。 - Sithu

5

看起来preg_replace('/[\pZ\pC]/u',' ',$field);起作用了(忘记在正则表达式末尾添加 u 了)


1
这对我有效,但请注意它似乎比所需的更具攻击性。提供的正则表达式也匹配“标准”ASCII空格。因此,如果您尝试仅替换Unicode非间隔空格(例如使用非空格字符),则将替换比您打算的更多字符。 - rinogo

2

同意 - 对于我的数据库,ISO-8859-1转换为UTF-8可以使用。 - Mat Carlson
如果我调用utf8_decode($field),当在网页上显示字段时,该字段仍将出现垃圾字符。在保存到数据库之前,我还需要修复空格问题,否则它将存储多个带有不同空格的“耐水性”的副本,而不是单个条目“耐水性”。 - Kai

0

你所称之为“unicode空格”的空格是不间断空格( 代表的是它)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接