2011-07-28 108 views
3

unicode字符串,我停留在比較在PHP兩個Unicode字符串,其既包含特殊字符「O」。一個字符串來自$_GET,另一個是文件系統的文件夾名稱(scandir())。這兩個字符串似乎等於我,使得比較兩個在PHP

var_dump($filter); 
var_dump($tail . '/' . $k); 
他們

也顯示出他們的平等,但與不同串lenghts(?!):

string '/blöb' (length=7) 
string '/blöb' (length=6) 

我的片段比較它們看起來如下:

if($filter == ($tail . '/' . $k)) { 
    /* ... */ 
} 

這是怎麼回事?

其他信息:$tail是一個空字符串:

string '' (length=0) 
+0

這是什麼'的print_r(解壓縮( 「H *」,$ K))'回報在你的兩個案件? –

+0

請記住,某些文件系統使用NFD(或接近它),並且您可能正在考慮NFC。如果你想進行二進制比較,你需要規範化爲同樣的東西。但是對文本進行二進制比較是不明智的。您需要使用UCA進行文本比較。來自OSCON的我上週[Unicode的七種語言對話](http://training.perl.com/OSCON2011/index.html)。 – tchrist

回答

3

在這裏看到:http://en.wikipedia.org/wiki/Unicode_equivalence並使用此:http://www.php.net/manual/en/class.normalizer.php

你可能在較長的字符串分解的字符,這意味着一個O和然後是疊加前一個字符的變音符號。

規格化功能將修復之類的東西。

作爲一個方面說明,如果您使用它來進行等效(例如,用戶名 - 要確保兩個人不選擇相同的用戶名,即使字符串的二進制表示形式恰好是不同的)。

+0

這個答案要求安裝['intl'](http://php.net/manual/en/book.intl.php)。所以如果你有它,那麼爲什麼不使用['collat​​or_compare'](http://php.net/manual/en/collat​​or.compare.php)?我在尋找所以,你要處理Unicode字符串不使用'intl' ... – user9645

+0

@ user9645,他們所有的* *龐大複雜的答案,而無需實際安裝的是知道如何處理Unicode的圖書館嗎?我不明白這怎麼可能。 – Ariel

+0

Ariel - 不,我只想要GNU intl的替代品。就這樣。 – user9645

-1

你可以嘗試解析他們通過函數utf8_encode()和檢查他們呢? PHP不支持unicode,因此建議使用utf8_encode/decode來獲取一些基本的Unicode功能。

http://php.net/manual/en/language.types.string.php

+0

感謝您回覆我的問題。我正在爲你投票。 –