bil*_*oah 11 php whitespace character-encoding
最近遇到了一个非常奇怪的问题,我的数据库包含看似正常的空白字符的字符串,但实际上是其他东西.
例如,应用于trim()字符串:
"TEST "
Run Code Online (Sandbox Code Playgroud)
来找我:
"TEST "
Run Code Online (Sandbox Code Playgroud)
结果是.所以我复制并粘贴字符串中的最后一个字符,然后:
echo ord(' ');
194
Run Code Online (Sandbox Code Playgroud)
194?根据应该是的ASCII表?.所以我在这一点上感到困惑.为什么这个角色看起来trim()像是空格trim()?当失败的时候我怎么能这样?
Mar*_*ker 16
它更可能是一个双字节194 160序列,它是NO-BREAK SPACE代码点的UTF-8编码(相当于 HTML 中的实体).
这真的不是一个空间,即使它看起来像一个.(例如,你会发现它不会自动换行.)\ s的正则表达式匹配会匹配它,但是与空格的简单比较不会; 也不会trim()删除它.
要用正常空间替换NO-BREAK空间,您应该能够执行以下操作:
$string = str_replace("\u{c2a0}", " ", $string);
Run Code Online (Sandbox Code Playgroud)
要么
$string = str_replace("\u{c2a0}", "", $string);
Run Code Online (Sandbox Code Playgroud)
删除它们
您可以尝试:
PHP修剪
$foo = "TEST ";
$foo = trim($foo);
Run Code Online (Sandbox Code Playgroud)
PHP str_replace
$foo = "TEST ";
$foo = str_replace(chr(194), '', $foo);
Run Code Online (Sandbox Code Playgroud)
重要提示:您可以尝试使用
chr(194).chr(160)或'\u00A0'
PHP preg_replace
$foo = "TEST ";
$foo = preg_replace('#(^\s+|\s+$)#', '', $foo);
Run Code Online (Sandbox Code Playgroud)
或(我不确定它是否会运作良好)
$foo = "TEST ";
$foo = preg_replace('#[\xC2\xA0]#', '', $foo);
Run Code Online (Sandbox Code Playgroud)