我有一个包含"\u00a0"的字符串,需要用空格替换它,但str_replace函数无法实现。

27

我需要清理一个字符串,该字符串从各种微软Office套件应用程序(ExcelAccess、和Word)中复制/粘贴,每个应用程序都有自己的编码集。

为了能够查看每个单独编码的字符,我使用json_encode进行调试。

我已经能够使用str_replace清除我发现的所有内容(\r \n),但是对于\u00a0,我没有成功。

$string = 'mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com'; //this is the output from json_encode

$clean = str_replace("\u00a0", "",$string);

返回:

mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com

这完全相同;它完全忽略了\u00a0。

有没有办法解决这个问题?此外,我感觉我正在重新发明轮子,有没有一个函数/类可以完全剥离每种可能的编码的每个字符?

____编辑____

在收到前两个回复后,我需要澄清一下,我的示例是有效的,因为它是json_encode的输出,而不是实际字符串!

9个回答

59

我将ord()substr()结合在包含\u00a0的字符串上,发现以下诅咒有效:

$text = str_replace( chr( 194 ) . chr( 160 ), ' ', $text );

谢谢!那为我节省了很多时间。"\xc2\xa0"也可以使用。 - elipoultorak
没错,对我有效。我正在尝试从一个有法语文本的网站上爬取数据。 - Manikandan Arunachalam

10

试试这个:

$str = str_replace("\u{00a0}", ' ', $str);

我认为你误解了问题。 - Dharman
1
谢谢。根据https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double的说明,这是正确的符号表示法,用于替换Unicode。OP的问题是关于字面意义上的`\u00a0`字符串,但这正是我想要的。 - user3342816
这是唯一对我有效的方法。 - Gabriel Veiga Cardoso

6

当我复制/粘贴您的代码时,它对我有效。尝试用单引号替换您的str_replace()中的双引号,或转义反斜杠("\\u00a0")。


在你的例子中它能够工作是因为你使用了json_encode的输出而不是实际字符串!如果我复制粘贴我的代码,它对我来说也能完美地工作。 - 0plus1
如果您替换\xa0而不是\u00a0会发生什么? - Annika Backstrom
这种情况发生了。它确实删除了 \u00a0 的实例,当从 json_encode 打印时看起来没问题,但是如果我在没有使用 json_encode 的情况下输出字符串,我会得到一个 �,而之前是 \u00a0。此时我无法理解发生了什么,请给我一个解释! :-) - 0plus1
我找到了解决方案,只需将json_encode分配给一个变量,然后像没有明天一样进行str_replace。如果您愿意,我仍然很想了解\xa0的诀窍.. - 0plus1
这可能是一个空字符... 转义字符\u00a0表示“十六进制值为00a0的Unicode字符。” 我最初的建议只会剥离a0部分。尝试用空字符串替换\x00a0。 - Annika Backstrom

5
我刚遇到了同样的问题。显然,PHP的json_encode将对任何包含“不间断空格”的字符串返回null。
解决方法是用普通空格替换它:
str_replace(chr(160),' ');

希望这个可以帮到某些人 - 我花了一个小时才弄明白。


4
这个也可以,我在某处找到了。
$str = trim($str, chr(0xC2).chr(0xA0));

2
这到底是怎么回事!这个答案是我唯一的有效解决方案。能否解释一下解决方法? - hunter
现在不记得了 :P - www.amitpatil.me

3

1
这对我有用:
$str = preg_replace( "~\x{00a0}~siu", " ", $str );

0

你必须像这样使用单引号:

str_replace('\u00a0', "",$string);

或者,如果你喜欢使用双引号,你必须转义反斜杠 - 看起来像这样:

str_replace("\\u00a0", "",$string);

我也遇到了这个问题。以下是解决方法:我将带有已知\u00a0字符的字符串复制到编辑器中,然后将\u00a0表示的空格复制并粘贴到str_replace函数中。最终的结果如下:str_replace(" ","",$string)。第一个参数中的空格是非标准的\u00a0。现在通过json_encode运行即可。 - Nick Johnson

0
你可以使用 json_encode($string, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

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