Làm cách nào Chrome quyết định những gì cần làm nổi bật khi bạn nhấp đúp vào văn bản tiếng Nhật?


214

Nếu bạn bấm đúp vào văn bản tiếng Anh trong Chrome, từ được phân tách bằng khoảng trắng bạn đã nhấp sẽ được tô sáng. Điều này không đáng ngạc nhiên. Tuy nhiên, một ngày khác, tôi đã nhấp vào trong khi đọc một số văn bản bằng tiếng Nhật và nhận thấy rằng một số từ được tô sáng ở ranh giới từ, mặc dù tiếng Nhật không có khoảng trắng. Dưới đây là một số ví dụ văn bản:

ど こ こ こ

Ví dụ: nếu bạn nhấp vào 薄 暗, Chrome sẽ làm nổi bật chính xác nó thành một từ duy nhất, mặc dù đó không phải là một lớp ký tự đơn (đây là sự pha trộn của kanji và hiragana). Không phải tất cả các điểm nổi bật là chính xác, nhưng chúng không có vẻ ngẫu nhiên.

Chrome quyết định những gì cần làm nổi bật ở đây? Tôi đã thử tìm kiếm nguồn Chrome cho "từ tiếng Nhật" nhưng chỉ tìm thấy các thử nghiệm cho một mô-đun thử nghiệm dường như không hoạt động trong phiên bản Chrome của tôi.


1
@Nathaniel Tôi không biết nó phù hợp với bạn như thế nào, nhưng khi tôi nhấp đúp vào chữ Hán, nó chỉ chọn chữ Hán và khi tôi nhấp đúp vào hiragana, nó chỉ chọn hiragana liên tiếp, và tương tự cho một chút của katakana (nya nya)
Dâu tây

4
Phần じ め là một phần tốt để sử dụng trong việc kiểm tra xem trình duyệt có thực sự thực hiện lựa chọn từ thông minh hay không thay vì chỉ dừng việc chọn ở ranh giới kana / kanji / rōmaji. Đó là tất cả hiragana, nhưng Chrome (và Safari) chỉ chọn chính xác phần じ め じ (phần し là một động từ thay thế). Mặt khác, Firefox chọn không chính xác い じ じ め し (vì Firefox hoàn toàn không nhận ra ranh giới từ thực tế, nhưng dường như chỉ dừng lựa chọn ở ranh giới kana / kanji / rōmaji).
sIDIAbarker

2
@Strawberry tôi thấy. Đối với tôi, nó chọn từ 薄 暗, như được mô tả trong câu hỏi. (Chrome, Mac.)
Nathaniel

1
Với một ngoại lệ, trong mọi ứng dụng macOS duy nhất tôi đã thử nghiệm - TextEdit, Stickies, Notes, Terminal, v.v. - nhấp đúp vào lựa chọn từ thông minh của văn bản tiếng Nhật hoạt động như mong đợi. Vì vậy, trên macOS ít nhất, Chrome không làm gì đặc biệt cho điều này mà hầu như tất cả các ứng dụng macOS khác cũng không làm - đó chỉ là sử dụng hỗ trợ ngắt từ dựa trên ICU hiện có được tích hợp trong macOS.
sIDIAbarker

1
Trên macOS, Firefox là ngoại lệ duy nhất tôi thấy với quy tắc rằng tất cả các ứng dụng macOS đều có thể thực hiện cùng một kiểu lựa chọn từ thông minh nhấp chuột hai lần của văn bản tiếng Nhật được mô tả trong câu hỏi này. Firefox dường như chỉ làm điều đơn giản hơn nhiều khi chỉ dừng việc lựa chọn ở ranh giới kana / kanji / rōmaji. Tôi đã được một kỹ sư Firefox nói rằng vì Firefox không sử dụng API nền tảng macOS dựa trên ICU tích hợp để chọn văn bản. Xem lỗi bugzil.la/345823 liên quan .
sIDIAbarker

Câu trả lời:


165

Vì vậy, hóa ra v8 có một trình phân đoạn từ đa ngôn ngữ không chuẩn và nó xử lý tiếng Nhật.

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

Tôi cũng đã thực hiện một jsfiddle cho thấy điều này.

Chất lượng không đáng kinh ngạc nhưng tôi ngạc nhiên điều này được hỗ trợ.


24
Đây là một phần của dự án ICU: userguide.icu-project.org/boundaryanalysis , cũng xem unicode.org/reports/tr29/#Word_Boundaries
Xorlev

10
Đồng thời xem source.chromium.org/chromium/chromium/src/+/master:v8/src/ợi để biết nơi có dây.
Xorlev

4
Windows đã có khả năng chọn từ đúng khi nhấp đúp vào từ tiếng Nhật. Bạn thậm chí không cần Chrome cho việc này
phuclv

7
@phuclv: Không phải ai sử dụng Chrome cũng chạy nó trên Windows.
Sean

2
Bạn có chắc rằng hành vi v8 có bất kỳ ảnh hưởng nào đến việc chọn văn bản trong giao diện người dùng trình duyệt không? Cho rằng v8 là một công cụ JavaScript, tôi sẽ không nghĩ rằng bất kỳ mã v8 nào sẽ được thực thi trong khi bạn đang thực hiện lựa chọn văn bản trong giao diện người dùng trình duyệt. Tôi đoán bạn có thể kiểm tra bằng cách vô hiệu hóa JavaScipt trong trình duyệt và sau đó xem liệu bạn có quan sát hành vi tương tự không. Nếu bạn không, thì tôi nghĩ rằng sẽ cho thấy hành vi không phải do v8. (Tôi sẽ làm điều đó bản thân mình để kiểm tra nó, nhưng như tôi đã nêu trong bình luận khác, trong môi trường hệ điều hành MacOS của tôi, điều này đã làm việc bất kể là trình duyệt tôi thử nghiệm trong -. Không chỉ trong Chrome)
sideshowbarker

92

Dựa trên các liên kết được đăng bởi JonathonW , câu trả lời về cơ bản rút ra: "Có một danh sách lớn các từ tiếng Nhật và kiểm tra Chrome để xem bạn có nhấp đúp vào một từ không."

Cụ thể, v8 sử dụng ICU để thực hiện một loạt các công việc xử lý văn bản liên quan đến Unicode, bao gồm cả việc chia văn bản thành các từ . Mã phát hiện ranh giới ICU bao gồm "Công cụ ngắt dựa trên từ điển" cho các ngôn ngữ không có khoảng trắng, bao gồm tiếng Nhật, tiếng Trung, tiếng Thái, v.v.

Và với ví dụ cụ thể của bạn về "暗", bạn có thể tìm thấy từ đó trong từ điển Trung-Nhật kết hợp được vận chuyển bởi ICU (dòng 255431). Hiện tại có tổng số 315,671 từ tiếng Trung / tiếng Nhật trong danh sách. Có lẽ nếu bạn tìm thấy một từ mà Chrome không phân chia chính xác, bạn có thể gửi cho ICU một bản vá để thêm từ đó.



ICU và các dự án tương tự đã có từ lâu. Tôi sẽ không ngạc nhiên nếu công cụ V8 của Chrome đã chọn nó sau khi chúng chuyển từ WebKit, vốn có nguồn gốc trên các nền tảng nơi các công cụ văn bản tiêu chuẩn đã thực hiện loại mã thông báo này trong gần 20 năm.
gà trống
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.