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

pol*_*m23 217 javascript google-chrome cjk

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

?????????????????????????????????????????????????????? ???

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

Chrome 如何决定在这里突出显示什么?我尝试在 Chrome 源代码中搜索“日语单词”,但只找到了一个实验模块的测试,该模块在我的 Chrome 版本中似乎并不活跃。

pol*_*m23 167

所以事实证明 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('?????????????????????????????????????????????????????'))
// ["??", "?", "??", "??", "???", "??", "?", "?", "?", "?", "?", "???", "???", "????", "??", "?", "?", "??????", "?", "?", "?", "???", "??", "?", "??", "?", "?", "??", "?"]
Run Code Online (Sandbox Code Playgroud)

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

质量并不惊人,但我很惊讶这完全受支持。

  • 这是 ICU 项目的一部分:http://userguide.icu-project.org/boundaryanalysis,另请参阅 http://www.unicode.org/reports/tr29/#Word_Boundaries (26认同)
  • 另请参阅 https://source.chromium.org/chromium/chromium/src/+/master:v8/src/objects/js-break-iterator.cc;l=69-93;drc=7cba1ed502e90ece18cccc568eb2fb986b085aa1?originalUrl=https: %2F%2Fcs.chromium.org%2F 用于连接位置。 (10认同)
  • @phuclv:并非所有使用 Chrome 的人都在 Windows 上运行它。 (7认同)
  • Windows 已经能够在双击日语单词时选择正确的单词。你甚至不需要 Chrome (4认同)
  • 您确定 v8 行为对浏览器 UI 中的文本选择有影响吗?鉴于 v8 是一个 JavaScript 引擎,我认为当您在浏览器 UI 中进行文本选择时,不会执行任何 v8 代码。我想您可以通过在浏览器中禁用 JavaScipt 来进行检查,然后查看是否观察到相同的行为。如果你不这样做,那么我认为这表明该行为不是由 v8 引起的。(我会自己这样做来测试它,但正如我在另一条评论中指出的那样,在我的 macOS 环境中,无论我在哪种浏览器中测试,这都已经有效 - 不仅仅是在 Chrome 中。) (2认同)

erj*_*ang 94

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

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

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

  • [*Windows \[还\]使用字典查找方法进行双击选择*](https://r12a.github.io/scripts/tutorial/part5) (7认同)