localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为
localeCompare shows inconsistent behavior when sorting words with leading umlaut characters
在最新的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
低的排序值。因此,Aegypten
在Algerien
之前,意思是Ägypten
在Algerien
之前。
德语维基百科对此进行了更多阐述(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
等,这主要用于电话簿等名称列表。
维基百科继续说,这考虑到人名可能有多种拼写形式(某人的姓氏可能是Moeller或Möller,两个版本都存在),而对于字典中的单词,通常只有一种拼写被认为是正确的。
现在,我想剩下的价格问题是:我可以让浏览器对德语区域设置应用另一种形式的排序吗?坦率地说,我不知道。
能够在这两种排序形式之间进行选择肯定是可取的,因为正如维基百科所说,存在个人名字Moeller和Möller,但是在字典中只有Ägypten而不是Aegypten。
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 使用promise和mongoose对文档进行排序
- Selectize.js:如何对整数值的选项进行排序
- Javascript排序的图像弹出窗口..可以't单独弹出
- 当鼠标悬停在文本中的单词上时显示警报
- 如何通过引用var Using DataTables来进行分页或排序
- 匹配一个单词,其中候选人可以跨越顺序组(跨度)
- 如何使用jquery强制一个单词更改大小写等以保留品牌
- 拆分单词jquery
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 如何让程序检查所选单词中是否有按键
- localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为
- 以递增的渐变对十六进制颜色代码进行排序
- 如何删除空格和重新排序单词
- 如何按与单词匹配的程度对二维数组进行排序
- JavaScript-单词的反向排序
- 对javascript或jquery中的单词进行比较后的列表值进行排序
- 是否可以对同位素进行列排序?(jQuery库)
- 根据第一个单词对对象数组进行排序
- 搜索可能包含十六进制字符的单词