[javascript] 일본어 텍스트를 두 번 클릭하면 Chrome에서 강조 표시 할 내용을 어떻게 결정합니까?

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 을 만들었습니다 .

품질은 놀랍지 않지만 이것이 지원되는 것에 놀랐습니다.


답변

JonathonW에 의해 게시 된 링크를 기반으로 한 대답은 기본적으로 “일본어 단어가 많으며 Chrome에서 단어를 두 번 클릭했는지 확인합니다.”로 요약됩니다.

특히, v8은 ICU 를 사용 하여 텍스트를 단어로 나누는 것을 포함 하여 많은 유니 코드 관련 텍스트 처리 작업을 수행합니다 . ICU 경계 감지 코드에는 일본어, 중국어, 태국어 등 공백이없는 언어에 대한 “사전 기반 BreakIterator”가 포함 되어 있습니다.

그리고 “薄 暗 い”의 구체적인 예를 들어, ICU가 제공 한 중국어-일본어 사전 에서 해당 단어를 찾을 수 있습니다 (라인 255431). 현재 목록에 총 315,671 개의 중국어 / 일본어 단어가 있습니다. Chrome이 제대로 분리되지 않은 단어를 찾으면 해당 단어를 추가하기 위해 ICU에 패치를 보낼 수 있습니다.


답변