Unicode

Tiêu chuẩn mã hóa ký tự phổ quát bao gồm hơn 140.000 ký tự từ tất cả hệ thống chữ viết trên thế giới.

Unicode là tiêu chuẩn mã hóa ký tự quốc tế để biểu diễn tất cả ký tự thế giới trong một hệ thống duy nhất. Được quản lý bởi Unicode Consortium, Unicode 16.0 (phát hành năm 2024) chứa hơn 150.000 ký tự. Nó bao gồm các hệ thống chữ viết đang sử dụng như Latin, chữ Hán, tiếng Ả Rập và Devanagari, cũng như emoji, chữ hình nêm, chữ tượng hình và các chữ viết cổ khác.

Trước Unicode, các bảng mã ký tự khác nhau phổ biến theo ngôn ngữ và khu vực. Tiếng Nhật sử dụng Shift_JIS, EUC-JP và ISO-2022-JP; tiếng Trung sử dụng GB2312 và Big5; tiếng Hàn sử dụng EUC-KR. Trao đổi văn bản giữa các mã hóa khác nhau gây ra lỗi ký tự, và xử lý văn bản đa ngôn ngữ trong một tệp duy nhất gần như không thể. Unicode đã giải quyết triệt để vấn đề này bằng cách cho phép tất cả ký tự được biểu diễn trong một hệ thống mã duy nhất.

Unicode có ba triển khai mã hóa: UTF-8, UTF-16 và UTF-32. UTF-8 có độ dài thay đổi (1-4 byte), tương thích ASCII và là tiêu chuẩn thực tế trên web. UTF-16 sử dụng 2 hoặc 4 byte và đóng vai trò biểu diễn chuỗi nội bộ trong JavaScript và Java. UTF-32 có độ dài cố định 4 byte, đơn giản để xử lý nhưng hiếm khi được sử dụng trong thực tế do hiệu quả bộ nhớ kém.

Code point là khái niệm quan trọng để hiểu cấu trúc Unicode. Mỗi ký tự được gán một code point trong phạm vi từ U+0000 đến U+10FFFF. Mặt phẳng đa ngôn ngữ cơ bản (BMP, U+0000-U+FFFF) chứa hầu hết các ký tự thường dùng, trong khi các mặt phẳng bổ sung (U+10000 trở lên) chứa emoji, chữ viết cổ và ký tự CJK hiếm. Các ký tự ngoài BMP được biểu diễn dưới dạng cặp thay thế (hai đơn vị mã) trong UTF-16, ảnh hưởng đến đếm ký tự trong lập trình.

Một quan niệm sai lầm phổ biến là đánh đồng "Unicode = UTF-8." Unicode là tiêu chuẩn định nghĩa ánh xạ ký tự-đến-code-point, trong khi UTF-8 là một trong các triển khai của nó. Ngoài ra, "1 ký tự ≠ 1 code point" trong nhiều trường hợp. Ký tự kết hợp (ví dụ: ký tự cơ sở + dấu phụ) và chuỗi ZWJ emoji (ví dụ: emoji gia đình) tạo thành một ký tự hiển thị duy nhất từ nhiều code point.

Về đếm ký tự, sự phức tạp của Unicode khiến định nghĩa "số ký tự" trở nên mơ hồ. String.length của JavaScript trả về số đơn vị mã UTF-16, vì vậy emoji có độ dài 2. Đếm chính xác yêu cầu đếm dựa trên cụm grapheme, có sẵn trong JavaScript qua API Intl.Segmenter. Công cụ đếm ký tự nên xác định rõ "số ký tự" có nghĩa là code point, đơn vị mã UTF-16 hay cụm grapheme.

Chia sẻ bài viết này