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

2022-08-30 01:04:04

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

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

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

Chrome 如何决定在此处突出显示哪些内容?我尝试在Chrome源代码中搜索“日语单词”,但只发现了一个实验模块的测试,该模块在我的Chrome版本中似乎并不活跃。


答案 1

因此,事实证明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来显示这一点。

质量不是很好,但我很惊讶这得到了支持。


答案 2

根据JonathonW发布的链接,答案基本上可以归结为:“有一个很大的日语单词列表,Chrome会检查你是否双击了一个单词。

具体来说,v8使用ICU来做一堆与Unicode相关的文本处理,包括将文本分解成单词。ICU 边界检测代码包括一个“基于字典的 BreakIterator”,用于没有空格的语言,包括日语、中文、泰语等。

对于“薄暗い”的具体例子,您可以在ICU提供的中日合用词典(第255431行)中找到该词。目前,列表中共有315,671个中文/日文单词。据推测,如果您发现Chrome没有正确拆分的单词,则可以向ICU发送补丁以添加该单词。