用重音排序西里尔字

时间:2017-11-14 12:45:25

标签: javascript arrays sorting dictionary diacritics

我遇到了用cyrilica(带重音符号)编写的字符串数组的问题。以下解决方案在字符串的开头分别对带有和不带变音标记的字符串进行排序。

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>");
    });
}

修改
这是排序前的数组:
[..., 'áвтор', ..., 'авиабилéт', ..., 'янтáрный', ..., 'Áвстрия', 'áвтор', 'автостóп'];
这是在排序之后:
["авиабилéт", "автостóп", ..., "янтáрный", ..., "Áвстрия", "áвтор"]
这就是我想要的 ['авиабилéт', 'Áвстрия', 'áвтор', 'автостóп', ..., 'янтáрный', ...];

2 个答案:

答案 0 :(得分:1)

您未在options中提供sensitivity。可能默认值是'variant'(我在Chrome的控制台中试过),而你需要'base'

答案 1 :(得分:0)

经过一番调查后,我认为ICU项目或CLDR库的范围存在漏洞。

由于带有重音的字符通常被组合并保持为单个字符,因此西里尔字母&#39; a&#39;和拉丁&#39;口音变成了同一个角色。它使标准排序失败。

作为一种解决方法,我建议

  1. 使用.toLowerCase()
  2. 对案例进行规范化
  3. 使用.normalize('NFD')将单个字符展开为一系列基本字符+重音字符&#39;
  4. 使用.replace()
  5. 删除任何变音符号聊天
  6. 使用标准.sort()
  7. 我相信它应该有用。