Bỏ qua menu, tới nội dung

Grapheme là gì? Đơn vị ký tự người đọc nhìn thấy trên màn hình

Grapheme, gọi đầy đủ là extended grapheme cluster, là một cụm mã Unicode hiển thị thành đúng một ký tự trước mắt người đọc. Chuẩn Unicode Standard Annex #29 định nghĩa quy tắc cắt cụm này, và mọi công cụ trên demtuonline lấy grapheme làm đơn vị ký tự.

Cách trình duyệt tách grapheme

Trình duyệt làm việc tách bằng một hàm có sẵn, công cụ chỉ đếm số cụm nó trả về.

  1. Đưa văn bản về dạng dựng sẵn NFC.
  2. Gọi Intl.Segmenter('vi', {granularity: 'grapheme'}) để cắt chuỗi.
  3. Đếm số cụm thu được; dấu cách cũng là một cụm.
  4. Trình duyệt quá cũ không có hàm này thì công cụ cắt theo mã, khi đó emoji ghép bị tính hơn 1.

Một grapheme có thể gồm nhiều mã

Số grapheme thường nhỏ hơn số mã, và chênh lệch nằm ở dấu thanh cùng emoji ghép.

ChuỗiGraphemeCode point
ệ gõ kiểu dựng sẵn11
ệ gõ kiểu tổ hợp13
Cờ Việt Nam12
Emoji gia đình ba người15

Vì khoảng cách ấy, site cấm lấy thuộc tính length của chuỗi JavaScript làm số ký tự hiển thị: nó đếm đơn vị UTF-16, cho ra 2 với một emoji đơn giản. Bluesky cũng công bố giới hạn bài đăng theo grapheme, 300 đơn vị, trong khi X đếm theo trọng số nên hai nền tảng cho hai con số khác nhau với cùng một đoạn.

Công cụ đếm theo grapheme

Bốn trang sau cho thấy khác biệt giữa các đơn vị đếm.