2015-08-28 37 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'。 –