Grapheme Cluster
Đơn vị trực quan nhỏ nhất mà con người nhận thức là một ký tự đơn. Có thể bao gồm nhiều code point.
Grapheme cluster là đơn vị trực quan nhỏ nhất mà con người nhận thức là một ký tự đơn. Một grapheme cluster có thể bao gồm một hoặc nhiều code point Unicode. Được định nghĩa trong UAX #29 (Unicode Text Segmentation), nó là khái niệm nền tảng để xác định chính xác ranh giới "ký tự" trong xử lý văn bản.
Các ví dụ tiêu biểu về grapheme cluster bao gồm nhiều code point bao gồm ký tự kết hợp và emoji. The Japanese character "が" is a single code point in its precomposed form (U+304C), but in decomposed form consists of "か" (U+304B) and a combining dakuten (U+3099). Either way, it counts as one grapheme cluster. The flag emoji 🇯🇵 combines two Regional Indicator code points (U+1F1EF + U+1F1F5), and the family emoji 👨👩👧👦 consists of 7 code points (4 person emoji + 3 ZWJ characters), yet each is a single grapheme cluster. Sách xử lý văn bản Unicode giải thích chi tiết về grapheme cluster.
Các ngôn ngữ lập trình khác nhau định nghĩa "số ký tự" khác nhau, đó là lý do tại sao hiểu grapheme cluster quan trọng. String.length của JavaScript trả về số đơn vị mã UTF-16, vì vậy một emoji đơn có thể đếm là 2 hoặc nhiều hơn. len() của Python trả về số code point, nhưng điều này không khớp với số ký tự trực quan khi có ký tự kết hợp. Để có "số ký tự trực quan" chính xác, việc đếm phải được thực hiện ở cấp grapheme cluster.
Trong JavaScript, API Intl.Segmenter cho phép phân đoạn ở cấp grapheme. Tạo segmenter với new Intl.Segmenter('en', { granularity: 'grapheme' }) và sử dụng phương thức segment() chia chuỗi thành các grapheme cluster. Trong Python, thư viện grapheme cung cấp chức năng này, trong khi String.count của Swift mặc định đếm grapheme cluster.
Một quan niệm sai lầm phổ biến về grapheme cluster là giả định rằng "1 code point = 1 ký tự". Điều này đúng trong phạm vi ASCII nhưng không còn đúng với ký tự kết hợp, surrogate pair và chuỗi ZWJ. Không tính đến grapheme cluster trong triển khai cắt ngắn văn bản hoặc di chuyển con trỏ có thể khiến ký tự bị chia giữa chuỗi (tạo ra văn bản lỗi) hoặc con trỏ bỏ qua những gì trông như một ký tự đơn. Sách lập trình quốc tế hóa bao gồm grapheme cluster như một chủ đề chính.
Để công cụ đếm ký tự chính xác, xử lý đúng grapheme cluster là thiết yếu. Bằng cách đếm những gì người dùng nhận thức là "1 ký tự" chính xác là 1, công cụ có thể cung cấp kết quả đáng tin cậy cho các tình huống thực tế như kiểm tra độ dài bài đăng mạng xã hội và giới hạn nhập liệu biểu mẫu. Khi các chuỗi emoji mới được thêm vào với mỗi bản cập nhật Unicode, quy tắc phân đoạn grapheme cluster liên tục được sửa đổi, đây là điều quan trọng cần xem xét để duy trì độ chính xác.