Búsqueda de sitios web

javascript - ¿Cómo decide Chrome qué resaltar cuando haces doble clic en un texto en japonés?


Si haces doble clic en un texto en inglés en Chrome, la palabra delimitada por espacios en la que hiciste clic se resalta. Esto no es sorprendente. Sin embargo, el otro día estaba haciendo clic mientras leía un texto en japonés y noté que algunas palabras se resaltaban en los límites de las palabras, aunque el japonés no tiene espacios. Aquí hay un ejemplo de texto:

No tengo ni idea de dónde nací. Lo único que recuerdo es que estaba llorando 'miau miau' en algún lugar sombrío y húmedo.

Por ejemplo, si hace clic en 薄暗い, Chrome la resaltará correctamente como una sola palabra, aunque no sea una sola clase de caracteres (es una mezcla de kanji e hiragana). No todos los aspectos destacados son correctos, pero tampoco parecen aleatorios.

¿Cómo decide Chrome qué resaltar aquí? Intenté buscar en el código fuente de Chrome "palabra japonesa", pero solo encontré pruebas de un módulo experimental que no parece estar activo en mi versión de Chrome.

Respuesta #1

Resulta que v8 tiene un segmentador de palabras multilingüe no estándar y maneja japonés.

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('どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。'))
// ["どこ", "で", "生れ", "たか", "とんと", "見当", "が", "つ", "か", "ぬ", "。", "何でも", "薄暗い", "じめじめ", "した", "所", "で", "ニャーニャー", "泣", "い", "て", "いた事", "だけ", "は", "記憶", "し", "て", "いる", "。"]

También hice un jsfiddle que muestra esto.

La calidad no es increíble, pero me sorprende que esto sea compatible en absoluto.

Respuesta #2

Según los enlaces publicados por JonathonW, la respuesta básicamente se resume a: "Hay una gran lista de palabras japonesas y Chrome comprueba si hiciste doble clic en una palabra."

Específicamente, v8 utiliza ICU para realizar un montón de cosas relacionadas con el procesamiento de texto Unicode, incluyendo dividir el texto en palabras. El código de detección de límites de ICU incluye un "BreakIterator basado en diccionario" para los idiomas que no tienen espacios, incluyendo japonés, chino, tailandés, etc.

Y para su ejemplo específico de "薄暗い", puede encontrar esa palabra en el diccionario combinado chino-japonés incluido con ICU (línea 255431). Actualmente, hay un total de 315.671 palabras chinas/japonesas en la lista. Presumiblemente, si encuentra una palabra que Chrome no separa correctamente, podría enviar un parche a ICU para agregar esa palabra.

Artículos relacionados