Как Chrome решает, что выделять при двойном щелчке по японскому тексту? - PullRequest
215 голосов
/ 08 мая 2020

Если вы дважды щелкните текст на английском языке sh в Chrome, выделенное вами слово, разделенное пробелами, будет выделено. Это не удивительно. Однако на днях я щелкал мышью, читая текст на японском, и заметил, что некоторые слова были выделены на границах слов, хотя в японском языке нет пробелов. Вот пример текста:

ど こ で 生 れ た か と ん と 見 が つ か ぬ。 何 で も 薄 暗 い じ じ め し 所 で ャ ー ニ ャ * 100 * 100 * * 100 * Например, если вы нажмете 薄 暗 い, Chrome правильно выделит его как отдельное слово, даже если это не отдельный символьный класс (это смесь кандзи и хираганы). Не все основные моменты правильные, но они не кажутся случайными.

Как Chrome решает, что здесь выделить? Я попытался найти в источнике Chrome «японское слово», но нашел только тесты для экспериментального модуля , который, похоже, не активен в моей версии Chrome.

Ответы [ 2 ]

166 голосов
/ 08 мая 2020

Оказывается, 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 , который показывает это.

Качество невысокое, но я удивлен, что оно вообще поддерживается.

93 голосов
/ 08 мая 2020

Основываясь на ссылках, размещенных JonathonW , ответ в основном сводится к: «Там большой список японских слов, и Chrome проверяет, не нажали ли вы слово дважды».

В частности, v8 использует ICU для выполнения множества операций обработки текста, связанных с Unicode, включая разбиение текста на слова . Код определения границ ICU включает «Dictionary-Based BreakIterator» для языков, в которых нет пробелов, включая японский, китайский, тайский и др. c.

И для ваших Speci c пример "薄 暗 い", вы можете найти это слово в объединенном китайско-японском словаре, отправленном ICU (строка 255431). В настоящее время в списке 315 671 китайское / японское слово. Предположительно, если вы найдете слово, которое Chrome не разделяется должным образом, вы можете отправить ICU патч, чтобы добавить это слово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...