Intl.Collat​​or对日语进行排序-为什么排序规则不首先优先考虑日语字符?

时间:2019-02-05 21:43:15

标签: javascript internationalization

我们正与一位朋友一起研究排序问题,我们希望使用Intl.Collator compare的最佳做法根据语言环境进行排序。

对于所有语言环境,这都可以按预期工作,因为该语言的字符或文本优先于其他语言,但是日语似乎有所不同。

function letterSort(lang, letters) {
  letters.sort(new Intl.Collator(lang).compare);
  return letters;
}

console.log('EN sort:');
console.log(letterSort('en', ['a', '手に', '大人', 'b', '学校', '#', '金魚', 'きんぎょ', 'キンギョ']));

// =>["#", "a", "b", "きんぎょ", "キンギョ", "大人", "学校", "手に", "金魚"]

console.log('ZH sort:');
console.log(letterSort('zh', ['a', '手に', '大人', 'b', '学校', '#', '金魚', 'きんぎょ', 'キンギョ']));

// => ["#", "大人", "金魚", "手に", "学校", "a", "b", "きんぎょ", "キンギョ"]

console.log('JP sort:');
console.log(letterSort('ja', ['a', '手に', '大人', 'b', '学校', '#', '金魚', 'きんぎょ', 'キンギョ']));

// => ["#", "a", "b", "きんぎょ", "キンギョ", "大人", "学校", "手に", "金魚"]

在上面的代码片段中,您会注意到英语和中文,它们都将分别优先处理其自己的文本。日语却没有。

经过一番挖掘,我发现其中有一个ICU Project Demo,而且似乎由ICU执行并执行了类似的排序。看起来也像ordering in Japanese is a tough problem

enter image description here

我的同事将其发布为要点,我觉得这篇文章有点感动

  

好吧,我认为我对问题的理解更好,基本上日语有四个有效字符集,其中之一是罗马字符,因此用日语排序将对每个字符集进行内部排序,而不是在彼此之间进行排序。罗马字符排在这四组中的第一位(原因是unicode)。

^那个解释正确吗?还是有一种更好的更合适的方式来订购日语,即首先将日语字符放在优先位置(虽然这样的声音虽然不好,但是让我感到惊讶的是日本人可以在排序的末尾使用自己的语言)。文章还详细讨论了该问题,但我不确定是否有找到订购日语的新方法

1 个答案:

答案 0 :(得分:1)

由于日语有四种有效的字符集,因此仅在每个字符集中进行排序,然后以预定的方式将每个字符集相对于彼此排序:

  1. Rōmaji
  2. Katakana
  3. Hiragana
  4. Kanji

注意:罗马字,只是罗马字符集。

您可以自己尝试:

function letterSort(lang, letters) {
  letters.sort(new Intl.Collator(lang).compare);
  return letters;
}

const kanji = ['南', '北', '打'];
const hiragana = ['ぬ', 'ち', 'よ'];
const katakana = ['シ', 'イ', 'ホ'];
const romaji = ['a', 'c', 'b'];

console.log(letterSort('ja', [...kanji, ...hiragana, ...katakana, ...romaji]))

我们确实看到结果与我们期望的一致:字符集首先相对于彼此进行排序,而更细化的排序仅在每个字符集中发生。