字符串比较:PHP中类似JavaScript的localeCompare的功能?

3

有没有办法在PHP中拥有与JavaScript的 string.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中对象哈希的其他想法?
2个回答

4

请查看intl扩展

例如:

<?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

我不知道如何在JavaScript中提供完全相同的功能。不过感谢您的想法,我会查找“intl”。 - Gábor Imre

-1

你有strcmp

int strcmp ( string $str1 , string $str2 )

如果字符串相同则返回0,如果小于则返回负数,如果大于则返回正数


我已经将示例添加到问题中,strcmp 在那里会失败。 - Gábor Imre
strcmp是一个简单的二进制比较函数。localCompare是一个(部分)语言感知的比较函数。它们是不同的。 - Kissaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接