Chrome 如何决定双击日语文本时突出显示的内容?

How does Chrome decide what to highlight when you double-click Japanese text?

如果您双击 Chrome 中的英文文本,您单击的以空格分隔的单词会突出显示。这并不奇怪。然而,前几天我在阅读一些日语文本时点击鼠标,注意到有些单词在单词边界处突出显示,即使日语没有空格。下面是一些示例文本:

どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

例如,如果您点击薄暗い,Chrome 会正确地将其突出显示为单个单词,即使它不是单个字符 class(这是汉字和平假名的混合) .并非所有的亮点都是正确的,但它们似乎不是随机的。

Chrome 如何决定在这里突出显示的内容?我尝试在 Chrome 源中搜索 "japanese word",但只找到了 experimental module 的测试,它在我的 Chrome.

版本中似乎并不活跃

原来 v8 有一个非标准的多语言分词器,它处理日语。

function tokenizeJA(text) {
  var it = Intl.v8BreakIterator(['ja-JP'], {type:'word'})
  it.adoptText(text)
  var words = []

  var cur = 0, prev = 0

  while (cur < text.length) {
    prev = cur
    cur = it.next()
    words.push(text.substring(prev, cur))
  }

  return words
}

console.log(tokenizeJA('どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。'))
// ["どこ", "で", "生れ", "たか", "とんと", "見当", "が", "つ", "か", "ぬ", "。", "何でも", "薄暗い", "じめじめ", "した", "所", "で", "ニャーニャー", "泣", "い", "て", "いた事", "だけ", "は", "記憶", "し", "て", "いる", "。"]

我还制作了一个 jsfiddle 来展示这一点。

质量并不惊人,但令我惊讶的是它得到了支持。

基于links posted by JonathonW,答案基本上可以归结为:"There's a big list of Japanese words and Chrome checks to see if you double-clicked in a word."

具体来说,v8 对没有空格的语言使用 ICU to do a bunch of Unicode-related text processing things, including breaking text up into words. The ICU boundary-detection code includes a "Dictionary-Based BreakIterator",包括日文、中文、泰文等

对于“薄暗い”的具体示例,您可以在组合 Chinese-Japanese dictionary shipped by ICU 中找到该词(第 255431 行)。当前列表中共有 Chinese/Japanese 个单词 315,671。据推测,如果您发现 Chrome 没有正确拆分的单词,您可以向 ICU 发送补丁以添加该单词。