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ề.
- Đưa văn bản về dạng dựng sẵn NFC.
- Gọi
Intl.Segmenter('vi', {granularity: 'grapheme'})để cắt chuỗi. - Đếm số cụm thu được; dấu cách cũng là một cụm.
- 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ỗi | Grapheme | Code point |
|---|---|---|
| ệ gõ kiểu dựng sẵn | 1 | 1 |
| ệ gõ kiểu tổ hợp | 1 | 3 |
| Cờ Việt Nam | 1 | 2 |
| Emoji gia đình ba người | 1 | 5 |
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.
- Đếm byte UTF-8 hiện cùng lúc grapheme, code point, đơn vị UTF-16 và byte.
- Đếm emoji tách từng emoji và cho biết nó ngốn bao nhiêu mã.
- Đếm ký tự online dùng grapheme làm số ký tự chính.
- Phương pháp đếm ghi rõ luật chuẩn hoá và tách ký tự của site.