2010-09-08 53 views
3

我在數組從數據庫中字符串比較字符串列表:PHP字符串比較古怪

if (in_array($entry, array('Söme string', 'other-string'))) 

這適用於other-string,而不是Söme string,主要區別beeing這個字符串有一個變音符號和一個html實體。如果數據庫中的$entrySöme string,則比較失敗,即使它應該是相同的字符串。

我也試過strcmp和直接比較使用=====,但比較始終是負面的。在比較之前,我也嘗試過utf8_encode,但那沒做什麼。

數據庫使用UTF-8,我使用Drupal API函數獲取數據,我的php文件也是UTF-8編碼。如果我將$entrySöme string打印到輸出HTML,它們是無法區分的。

任何想法可能導致此行爲?

更新

感謝您的幫助。看起來 在途中被轉換,並且在數據庫中被存儲爲真正的非破壞性空間,而不是HTML實體。打印它將其轉換回HTML實體(或者,當我看着它時Firebug可以做到這一點)。

的var_dump的輸出()(使用打印功能,從得到的HTML源採取):

$entry: string(14) "Söme string"

"Söme string": string(18) "Söme string"

(I已經編輯的字符串作爲真鈔包含姓名)

更新2

我「已經改變了字符串"Some string"和這裏的的

var_dump(bin2hex($entry)); 
var_dump(bin2hex('Some string')); 

$entry: string(24) "536f6d65c2a0737472696e67" 
"Some string": string(32) "536f6d65266e6273703b737472696e67" 
+0

連接有什麼編碼? – Gumbo 2010-09-08 08:29:23

+0

PHP文件有什麼編碼? (定義硬編碼字符串的那個),或者用於比較的任何源。 – AlexanderMP 2010-09-08 08:32:18

+0

@Gumbo Drupal在任何地方都使用UTF-8,所以我很確定連接也使用UTF-8 – 2010-09-08 08:34:21

回答

4

輸出然後字符串是不一樣的。也許:

  • $entry有一個實際的空間,而不是一個不間斷的空間。
  • 其中一個具有HTML實體 ,而另一個具有實際的非間斷空間。
  • 在其中一個腳本中,字符ö被分解,而另一個則不是。

嘗試var_dump陣列和$entry

0

問題是$entry包含一個UTF-8編碼的非分裂空間(0xc2a0)。只要在它上面調用html_entities不起作用,因爲我沒有指定字符集。所以我的解決方案如下:

htmlentities($entry, ENT_QUOTES, 'UTF-8')