【问题标题】:String comparison: something identical of JavaScript's localeCompare in PHP?字符串比较:与 PHP 中 JavaScript 的 localeCompare 相同吗?
【发布时间】:2015-11-23 00:40:05
【问题描述】:

有没有办法让 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 中对象散列的其他想法?

【问题讨论】:

    标签: javascript php string-comparison


    【解决方案1】:

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

    【讨论】:

    • 我不知道如何在 JavaScript 中提供完全相同的功能。不过谢谢你的想法,我会看看intl
    【解决方案2】:

    你有 strcmp

    int strcmp ( string $str1 , string $str2 )
    

    如果相同的字符串返回 0 0

    【讨论】:

    • 我已将示例添加到问题中,strcmp 将在那里失败。
    • strcmp 是一个简单的二进制比较函数。 localCompare 是(部分)语言感知比较。它们是不同的。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2017-11-10
    • 1970-01-01
    • 2014-05-15
    • 2014-11-09
    相关资源
    最近更新 更多