Javascript 用重音对西里尔语单词进行排序

Javascript 用重音对西里尔语单词进行排序,javascript,arrays,sorting,dictionary,diacritics,Javascript,Arrays,Sorting,Dictionary,Diacritics,我遇到了一个问题,排序数组的字符串写在西里里亚语(口音)。下面的解决方案在字符串的开头分别对带和不带变音符号的字符串进行排序 function sorting(){ let words = document.querySelectorAll(".dictionary"); let unsorted = []; let collator = new Intl.Collator('ru', {sensitivity: 'base'}); words.forEac

我遇到了一个问题,排序数组的字符串写在西里里亚语(口音)。下面的解决方案在字符串的开头分别对带和不带变音符号的字符串进行排序

function sorting(){
    let words = document.querySelectorAll(".dictionary");   
    let unsorted = [];
    let collator = new Intl.Collator('ru', {sensitivity: 'base'});
    words.forEach(s => {
        unsorted.push(s.textContent);
    });
    unsorted.sort(collator.compare);
    unsorted.forEach(s => {
        document.write("<p>" + s + "</p>");
    });
}
函数排序(){
让words=document.queryselectoral(“.dictionary”);
让未排序=[];
让collator=new Intl.collator('ru',{sensitivity:'base'});
words.forEach(s=>{
未排序的推送(s.textContent);
});
未排序。排序(collator.compare);
未排序的。forEach(s=>{
文件。写(“”+s+”

”; }); }
编辑
这是排序前的数组:
[…,“аааааааааааааааааааааааа107
这是在排序之后:
[“а
这就是我想要的

[“аааааааааааааааааааааа

中未提供
灵敏度。可能默认值是“variant”(我在Chrome的控制台中尝试过),而您需要“base”

经过一些调查,我相信这是ICU项目或CLDR库中的一个缺陷

由于带重音的字符通常组合在一起并作为单个字符保留,因此带重音的西里尔字母“a”和拉丁字母“a”成为同一个字符。它使标准排序失败

作为解决办法,我建议

  • 使用
    .toLowerCase()规范化大小写
  • 使用
    .normalize('NFD')
    将单个字符扩展为一系列“基本字符+重音字符”
  • 使用
    .replace()
  • 使用标准的
    .sort()

  • 我相信它应该会起作用。

    您能提供一个包含要排序的字符串的自包含示例吗?您还检查了
    Intl.Collator.supportedLocalesOf('ru')
    返回的内容吗?您使用的浏览器(和版本)是什么?排序后是否也可以共享值?我添加了一个单词列表,很好地说明了这个问题。问题似乎只涉及以变音字符开头的单词。和
    Intl.Collator.supportedLocalesOf('ru')
    返回
    [“ru”]
    。我使用的是Chrome 62。@gurvinder372这是排序后的单词列表。但这是错误的顺序:)
    á
    -单词不应该在末尾。实际上,它不能正确处理带有西里尔符号的较大字符串集。在这种情况下,应该像这样添加第二个参数
    .sort((x,y)=>x.localeCompare(y,'ru'))
    -以指定要使用的字母表。它的工作原理与Intl.Collator object.I相同;我在丹麦语中发现了类似的铬错误。铬指的是,也就是说,所以很难找出谁是错误报告的接收者:)我不认为任何字母表上都有变音符号。它们都与Unicode相关(字母表中包含的Й和Ё除外)