2015-08-28 73 views
2

有什麼解決方案在PHP中使用與string.localeCompare()相同的字符串比較函數?字符串比較:在PHP中使用相同的JavaScript localeCompare?

我的目標是製作一個哈希器,它可以應用於PHP和JS中的簡單對象。財產的順序可以根據這個問題來解決: Sorting JavaScript Object by property value

我列出了屬性鍵和值元組,並按鍵排序。 (請注意,這也可以遞歸地工作。)但是我有點害怕字符串表示和區域設置,他們可能會很棘手。如果屬性鍵包含一些奇特的字符,那麼PHP和JS端的排序可能不同,導致不同的哈希值。

在PHP中嘗試以下內容,並在JS中進行類似的比較。

echo strcmp('e', 'é')."\n"; 
echo strcmp('e', 'ě')."\n"; 
echo strcmp('é', 'ě')."\n"; 
echo strcmp('e', 'f')."\n"; 
echo strcmp('é', 'f')."\n"; // This will differ 
echo strcmp('ě', 'f')."\n"; // This will differ 

主要問題:如何在PHP和JS中執行相同的字符串比較?

旁邊的問題:PHP和JS中的對象散列的其他想法?

回答

-1

你有STRCMP

int strcmp (string $str1 , string $str2) 

返回0,如果相同的字符串< 0,如果小,> 0,如果大

+0

我添加的例子的問題,'strcmp'會失敗在那裏。 –

+0

'strcmp'是一個簡單/簡單的二進制比較函數。 'localCompare'是一個(部分)語言意識的比較。他們是不同的。 – Kissaki

3

看一看的intl extension

例如

<?php 
// the intl extensions works on unicode strings 
// so this is my way to ensure this example uses utf-8 
define('LATIN_SMALL_LETTER_E_WITH_ACUTE', chr(0xc3).chr(0xa9)); 
define('LATIN_SMALL_LETTER_E_WITH_CARON', chr(0xc4).chr(0x9b)); 
ini_set('default_charset', 'utf-8'); 
$chars = [ 
    'e', 
    LATIN_SMALL_LETTER_E_WITH_ACUTE, 
    LATIN_SMALL_LETTER_E_WITH_CARON, 
    'f' 
]; 

$col = Collator::create(null); // the default rules will do in this case.. 
$col->setStrength(Collator::PRIMARY); // only compare base characters; not accents, lower/upper-case, ... 

for($i=0; $i<count($chars)-1; $i++) { 
    for($j=$i; $j<count($chars); $j++) { 
     echo $chars[$i], ' ', $chars[$j], ' ', 
      $col->compare($chars[$i], $chars[$j]), 
      "<br />\r\n"; 
    } 
} 

打印

e e 0 
e é 0 
e ě 0 
e f -1 
é é 0 
é ě 0 
é f -1 
ě ě 0 
ě f -1 
+0

我不知道如何在JavaScript中提供相同的功能。不過謝謝你的想法,我會環顧'intl'。 –