2012-09-13 162 views
0

我有2個字符串"CHILDREN’S"'完全相同'的字符串不同

其中一個被保存到MySQL數據庫(實際上它是一個來自WordPress的頁面標題)。另一個是數據庫中字符串的複製和粘貼版本。

當運行在2個字符串(var_dump("CHILDREN’S"); var_dump($string)var_dump,複製粘貼一個是string(12) "CHILDREN’S"並從數據庫中顯示的所述一個是string(16) "CHILDREN’S"。我假設這是一個UTF-8問題。

有人可以闡明爲什麼相同的字符串實際上不相同。

+1

你可能會在可見文本週圍留下空白,或者在字符串內某處存在不可見的字符? – Fluffeh

+0

很可能你有一個unicode字符。 –

+0

以及撇號字符當然不是'''。 – SDC

回答

0

這可能是一個編碼問題,在這種情況下,您需要檢查數據庫列的編碼並確保它符合您的預期。

或者,您可能在數據庫字符串中有幾個不可打印的字符 - 可能是您從數據庫工具中複製/粘貼了某些討厭的字符。

1

「CHILDREN'S」是十個字符。要使它成爲12,「'」必須成爲UTF-8編碼點,這沒問題。

但我沒有辦法得到16個字符,除非第二個報價確實是’。除HTML實體外,我沒有知道的七字節編碼。

如果是這樣,那麼html_entity_decode可能是你的朋友。

+1

'"'不是''',它是一個標準的雙引號字符。 – SDC

+0

你是完全正確的。我似乎無法計數到七個:'"'將會是六個字符,並且取代十個中的一個以獲得十六個所需的七個字符。事實是,我從來沒有真正困擾過記住那裏的所有無數引號。對於我來說,我會堅持使用舊的ASCII 0x27。 – LSerni

0

我猜想它實際上是作爲HTML實體存儲在字符串的其中一個版本中的。

如果它存儲爲’而不是實際的字符,那麼它顯然是不同的字符串長度。

請記住,PHP的strlen()函數不是多字節安全的。如果你有unicode字符,你應該使用mb_strlen()函數來代替,如果你想要一個準確的字符數。這可以解釋爲什麼即使你的短字符數是12,當字符串實際上只包含10個字符。

其他副本中的其他四個字符可能是由於HTML實體造成的。

0

要了解字符串的真正區別,可以將每個字符串中的十六進制數字寫出來。

例如:

$s1 = 'CHILDREN\'S'; 

for($i=0; $i<strlen($s1); $i++) 
    echo '0x' . bin2hex(substr($s1, $i, 1)) . ' '; 

這給出0x43 0x48 0x49 0x4c 0x44 0x52 0x45 0x4e 0x27 0x53作爲結果。嘗試使用數據庫中的字符串,並查看它的不同之處。

相關問題