1. ホーム
  2. ジャバスクリプト

[解決済み】日本語のテキストをダブルクリックしたとき、Chromeはどのようにハイライトを決定するのですか?

2022-04-20 12:26:39

質問

Chromeで英語のテキストをダブルクリックすると、クリックした空白で区切られた単語がハイライトされます。これは驚くことではありません。しかし、先日、日本語のテキストを読みながらクリックしたところ、日本語には空白がないのに、単語の境界でハイライトされている単語があることに気づきました。以下は、その例である。

<ブロッククオート

どこで生れたか見当がつくぬ。

例えば、薄暗いをクリックすると、Chromeは一文字クラスでないにもかかわらず、正しく一単語としてハイライトします(これは漢字とひらがなの混在です)。すべてのハイライトが正しいわけではありませんが、ランダムに表示されるわけでもないようです。

Chromeはここで何をハイライトするかをどのように決定しているのでしょうか?Chrome のソースで "日本語" を検索してみましたが、以下のようなテストしか見つかりませんでした。 実験モジュール 私のバージョンの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 を表示させることができます。

品質は驚くほどではありませんが、これが全くサポートされていないのは驚きです。