奇怪的空格字符 - utf8 PHP

4

我有一个奇怪的字符串中的空格问题,空格并不是真正的空格。我遇到了一个用正则表达式和str_replace转换它们的问题。

echo str_replace(' ','_',$string);

有什么办法可以解决这个问题吗?utf8_encode也不起作用,正则表达式\s也不行。当你将这段文本复制到Notepad ++中时,它显示为

Ê    

而不是空格。

我想要实现的是运行这个正则表达式

preg_replace('/[^a-z0-9 ]/i','',$string) 

但是由于这些"空格"并不是真正的空格,它们也会被一同移除。


你在用什么编程语言?我只能看出来它涉及到 str_replaceutf8_encode 函数... - Laurence Gonsalves
1
可能是因为Notepad++转换问题而不是UTF8 PHP的原因吗? - Tarik
不,PHP并没有处理它,使用记事本只是为了查看它是否是空格或其他字符。当尝试在记事本中转换为UTF8时,它显示\ CA。 - Marcin
Notepad++ 可能会错误地检测该字符的错误字符编码。在 PHP 中,没有简单的方法可以替换字符串中所有可能被视为某种形式的空格(有很多)的 Unicode 字符。如果您的目标字符串不支持空格(例如 URL),那么实际上可能有许多其他不可接受的字符。我认为,如果您解释一下您实际想要实现什么,可能会有其他解决方案。 - Evert
我想要实现的是运行这个正则表达式 preg_replace('/[^a-z0-9 ]/i','',$string),但由于那些“空格”不是真正的空格,它们也被移除了。 - Marcin
正则表达式需要使用 u 标志来处理 UTF-8 编码。 - Álvaro González
1个回答

4

我想我明白了,来自PHP官网:

你可能会想知道为什么

trim(html_entity_decode(' '));    

如果一个字符串包含' '实体(即不间断的空格),使用trim()方法无法将其缩减为空字符串,这是因为' '实体不是ASCII代码32(被trim()删除的代码),而是默认的ISO 8859-1字符集中的ASCII代码160(0xa0)。


1
不,诀窍在于使用 /\xA0/u。始终只处理Unicode字符,而不是序列化。 - tchrist
没错。nbsc代表不间断空格。它不被视为空白字符。 - Phil
1
在HeavyDots,我们写了一篇有趣的文章,讨论了“奇怪的空白”,并提供了一个工具来爬取URL并检测它,以及我们在PHP中使用的查找和替换技术。欢迎访问我们的博客查看!;-) http://heavydots.com/blog/when-the-white-space-became-a-beast - Alexandru Trandafir Catalin

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