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


214

如果您在Chrome中双击英文文本,则会高亮显示您单击的空格分隔的单词。这不足为奇。但是,有一天,我在阅读日语的一些文本时单击鼠标,发现即使日语没有空格,某些单词也会在单词边界处突出显示。这是一些示例文本:

でも生れたかとんと见当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは记忆している。

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

Chrome如何决定在此处突出显示的内容?我尝试在Chrome来源中搜索“日语单词”,但只发现了针对一个实验性模块的测试,该模块在我的Chrome版本中似乎未激活。


1
@Nathaniel我不知道这对您有什么好处,但是当我双击汉字时,它只会选择汉字,而当我在平假名中双击时,它只会选择连续的平假名,并且一点点都一样。片假名(nya nya)的评论
草莓

4
じめじめした部分是测试浏览器是否实际上在进行智能单词选择而不只是在假名/汉字/rōmaji边界停止选择时使用的好部分。都是平假名,但是Chrome(和Safari)正确选择了じめじめ部分(した部分是动词变位)。另一方面,Firefox错误地选择了いじめじめした(因为Firefox根本无法识别实际的单词边界,但显然只是在假名/汉字/rōmaji边界处停止了选择)。
sideshowbarker

2
@草莓我明白了。对我来说,它选择了“薄暗い”一词,如问题中所述。(苹果机,Chrome浏览器)
纳撒尼尔

1
除了一个例外,在我测试过的每个macOS应用程序(TextEdit,Stickies,Notes,Terminal等)中,双击日语文本的智能单词选择均按预期工作。因此,至少在macOS上,Chrome并没有为此做任何实际上所有其他macOS应用程序都没有做的特别事情-只是使用了macOS中内置的基于ICU的现有断字支持。
sideshowbarker

1
在macOS上,我发现Firefox是唯一的例外,该规则规定macOS应用程序都可以执行此问题中描述的日语文本的双击智能单词选择。Firefox似乎只做简单得多的事情,只是在假名/汉字/rōmaji边界停止选择。一位Firefox工程师告诉我,这是因为Firefox不使用基于ICU的内置macOS平台API进行文本选择。请参阅相关的bug bugzil.la/345823
sideshowbarker

Answers:


165

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

质量并不惊人,但是我对此感到惊讶,这是完全可以支持的。



10
另请参阅 source.chromium.org/chromium/chromium/src/+/master:v8/src/...的地方,在真实有线。
Xorlev

4
双击日语单词时,Windows已经可以选择正确的单词。您甚至不需要Chrome
phuclv

7
@phuclv:不是所有使用Chrome的人都在Windows上运行它。
肖恩

2
您确定v8行为对浏览器用户界面中的文本选择有影响吗?鉴于v8是JavaScript引擎,当您在浏览器用户界面中选择文本时,我认为不会执行任何v8代码。我猜您可以通过在浏览器中禁用JavaScipt来检查,然后查看是否观察到相同的行为。如果您不这样做,那么我认为这表明该行为不是由于v8引起的。(我会自己进行测试,但是正如我在另一条评论中指出的那样,在我的macOS环境中,无论我在哪个浏览器中进行测试(不仅是在Chrome中进行测试),这种方法都已经可以使用。)
sideshowbarker

92

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

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

对于您的“薄暗い”的特定示例,您可以在ICU发行的汉日组合字典中找到该单词(第255431行)。当前列表中共有315,671个中文/日语单词。据推测,如果您发现Chrome无法正常拆分的单词,则可以向ICU发送补丁程序以添加该单词。



ICU和类似项目已经存在了很长时间。如果Chrome的V8引擎从WebKit过渡之后选择了它,我不会感到惊讶,该WebKit起源于标准文本引擎已经进行了近20年的这种标记化的平台。
rickster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.