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.
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.