2017-02-23 200 views
4

最近遇到一個非常奇怪的問題,其中我的數據庫包含字符串,看起來像是普通的空白字符,但實際上是其他字符。從字符串修剪空白ASCII字符「194」

例如,應用trim()字符串:

"TEST " 

是讓我:

"TEST " 

結果。所以我複製並粘貼字符串中的最後一個字符:

echo ord(' '); 
194 

194?根據ASCII表應該是。所以我只是困惑在這一點上。爲什麼這個字符看起來是空白的,當trim()失敗時,我怎樣才能使用trim()這樣的字符?

回答

4

你可以試試:

PHP trim

$foo = "TEST "; 
$foo = trim($foo); 

PHP str_replace函數

$foo = "TEST "; 
$foo = str_replace(chr(194), '', $foo); 

重要提示:您可以通過chr(194).chr(160)'\u00A0'

PHP的preg_replace嘗試

$foo = "TEST "; 
$foo = preg_replace('#(^\s+|\s+$)#', '', $foo); 

OR(我不知道這是否會工作得很好)

$foo = "TEST "; 
$foo = preg_replace('#[\xC2\xA0]#', '', $foo); 
+0

謝謝。唯一有效的是'chr(194).chr(160)'。那究竟是什麼? – billynoah

+2

[PHP的'chr()'](http://php.net/manual/en/function.chr.php)返回ASCII碼的字符。您可以檢查[ASCII表格](http://www.asciitable.com/)。如果你想獲得一個字符的ASCII碼,你可以使用['ord()'](http://php.net/manual/en/function.ord.php) – Condorcho

5

它更可能是一個兩字節的194160序列,它是NO-BREAK SPACE代碼點(相當於HTML中的 實體)的UTF-8編碼。

這真的不是一個空間,即使它看起來像一個。 (例如,你會看到它不會自動換行。)\ s的正則表達式匹配會匹配它,但與空格的簡單比較不會; trim()也不會刪除它。

要與正常的空格替換NO-BREAK空間,你應該能夠做一些事情,如:

$string = str_replace("\u{c2a0}", " ", $string); 

$string = str_replace("\u{c2a0}", "", $string); 

他們刪除

+0

感謝您的答案,因爲它提供了更多的細節,但不幸的是沒有爲我工作。爲了什麼值得我安裝lib_mysqludf_preg,並且能夠這樣做來修復我的表:UPDATE table SET cell = trim(preg_replace('/ [[:space:]] + /','',cell)); – billynoah

0

有同樣的問題。解決它與

trim($str, ' ' . chr(194) . chr(160))