localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为

localeCompare shows inconsistent behavior when sorting words with leading umlaut characters

本文关键字:排序 单词进 不一致 字符 显示 localeCompare      更新时间:2023-09-26

在最新的Firefox和Chrome(在我的系统上有一个"de"语言环境)中测试:

"Ä".localeCompare("A")

给了我 1,这意味着它认为"Ä"应该按排序顺序出现在"A"之后,这是正确的。

但:

"Ägypten".localeCompare("Algerien")

给我 -1,这意味着它认为"Ägypten"应该按排序顺序出现在"Algerien"之前

为什么?为什么它会忽略每个字符串的第一个字符,如果它说当你自己检查它时,第一个字符串的第一个字符应该出现在第二个字符串的第一个字符之后?

这里有适合您需求的方法,复制粘贴此方法:

字符串

的递归解析并给出字符区域设置比较结果而不是字符串:)

最终结果错误修复,添加了对整个字符串的比较(不正确的停止或递归循环):

String.prototype.MylocaleCompare = function (right, idx){
    idx = (idx == undefined) ? 0 : idx++;
    var run = right.length <= this.length ? (idx < right.length - 1 ? true : false) : (idx < this.length - 1 ? true : false);

    if (!run) 
    {
        if (this[0].localeCompare(right[0]) == 0)
            {
                return this.localeCompare(right);
            }
            else
            {
                return this[0].localeCompare(right[0])
            }
    }
    if(this.localeCompare(right) != this[0].localeCompare(right[0]))
    {
        var myLeft = this.slice(1, this.length);
        var myRight = right.slice(1, right.length);
        if (myLeft.localeCompare(myRight) != myLeft[0].localeCompare(myRight[0]))
        {
            return myLeft.MylocaleCompare(myRight, idx);
        }
        else
        {
            if (this[0].localeCompare(right[0]) == 0)
            {
                return myLeft.MylocaleCompare(myRight, idx);
            }
            else
            {
                return this[0].localeCompare(right[0])
            }
        }
    }
    else
    {
        return this.localeCompare(right);
    }
}

http://en.wikipedia.org/wiki/Diaeresis_(音调符号)#Printing_conventions_in_German

"当按字母顺序对德语单词进行排序时,变音通常与底层元音没有区别,尽管如果两个单词仅因变音而不同,则变音的单词排在第二位 [...]
"还有第二个系统使用有限,主要用于对姓名进行排序(俗称"电话簿排序"),它将ü视为ue,等等。

假设应用了第二种排序算法,那么您看到的结果是有意义的。

Ä会变得Ae,这比你的其他值A"更长",所以在Ae之前A排序,因此在Ä之前A排序是正确的(正如你自己所说,你认为这是正确的;即使通过第一个算法,它只是将Ä视为A它是正确的, 太)。

现在Ägypten变得Aegypten用于排序目的,因此它必须出现在相同的排序逻辑中Algerien之前 - 两个术语的第一个字母相等,因此由第二个字母确定排序顺序,并且e在字典上具有比l低的排序值。因此,AegyptenAlgerien之前,意思是ÄgyptenAlgerien之前。


德语维基百科对此进行了更多阐述(http://de.wikipedia.org/wiki/Alphabetische_Sortierung#Einsortierungsregeln_f.C3.BCr_weitere_Buchstaben),并指出相关的DIN 5007有两种变体。

DIN 5007变体1说,ä应被视为aö被视为oü被视为u,并且这种排序将用于字典等。

DIN 5007变体1说的是另一件事,ä被视为ae等,这主要用于电话簿等名称列表。

维基百科继续说,这考虑到人名可能有多种拼写形式(某人的姓氏可能是MoellerMöller,两个版本都存在),而对于字典中的单词,通常只有一种拼写被认为是正确的。


现在,我想剩下的价格问题是:我可以让浏览器对德语区域设置应用另一种形式的排序吗?坦率地说,我不知道。

能够在这两种排序形式之间进行选择肯定是可取的,因为正如维基百科所说,存在个人名字MoellerMöller,但是在字典中只有Ägypten而不是Aegypten