UTF-8

Bảng mã Unicode có độ dài thay đổi. Bảng mã ký tự thống trị trên web, được sử dụng bởi hơn 98% trang web.

UTF-8 là bảng mã ký tự có độ dài thay đổi để triển khai Unicode. RFC 3629 (tháng 11 năm 2003, Internet Standard STD 63) định nghĩa nó là cách mã hóa các ký tự từ U+0000 đến U+10FFFF thành chuỗi 1 đến 4 byte, duy trì tương thích hoàn toàn với ASCII (chữ cái, chữ số và ký hiệu) trong khi biểu diễn được các ký tự có trong Unicode. Theo khảo sát sử dụng của W3Techs, tính đến tháng 8 năm 2026, 99,0% các trang web có bảng mã ký tự được xác định sử dụng UTF-8, khiến nó trở thành bảng mã ký tự tiêu chuẩn thực tế trên web.

Số byte UTF-8 thay đổi theo loại ký tự. ASCII (U+0000-U+007F) sử dụng 1 byte, Latin mở rộng và Cyrillic (U+0080-U+07FF) sử dụng 2 byte, ký tự Nhật/Trung/Hàn bao gồm kanji, hiragana và katakana (U+0800-U+FFFF) sử dụng 3 byte, và emoji cùng một số ký tự CJK (U+10000-U+10FFFF) sử dụng 4 byte. Thiết kế độ dài thay đổi này cho phép văn bản tiếng Anh được lưu trữ ở kích thước ASCII trong khi biểu diễn hiệu quả văn bản đa ngôn ngữ.

UTF-8 trở thành tiêu chuẩn web vì nhiều lý do. Tương thích ASCII nghĩa là các giao thức dựa trên ASCII hiện có (HTTP, SMTP, URL) và công cụ hoạt động không thay đổi. Nó không có vấn đề thứ tự byte (endianness) và không yêu cầu BOM (Byte Order Mark). Nó cũng có tính năng tự đồng bộ, cho phép xác định ranh giới ký tự từ bất kỳ điểm nào trong luồng byte, khiến nó có khả năng chống chịu hỏng dữ liệu.

Trong HTML, bảng mã ký tự được khai báo bằng <meta charset="UTF-8">. Không có khai báo này, trình duyệt có thể nhận dạng sai mã hóa, gây ra văn bản lỗi. Nó cũng có thể được chỉ định qua header phản hồi HTTP Content-Type: text/html; charset=utf-8, và khai báo ở cả hai nơi giúp khai báo vẫn có hiệu lực ngay cả khi tệp được mở riêng lẻ.

Xử lý UTF-8 trong cơ sở dữ liệu cần chú ý. utf8 của MySQL là bí danh của utf8mb3, một bộ ký tự chỉ xử lý tối đa 3 byte cho mỗi ký tự nên không thể lưu trữ ký tự 4 byte (như emoji). Tính đến tháng 8 năm 2026, tài liệu tham chiếu dòng 8.4 liệt kê cả bí danh này và chính utf8mb3 là không còn được khuyến nghị và dự kiến sẽ bị loại bỏ trong một bản phát hành lớn trong tương lai. Để lưu trữ tất cả ký tự Unicode bao gồm emoji, phải sử dụng utf8mb4. UTF8 của PostgreSQL hỗ trợ 4 byte ngay từ đầu.

Đối với đếm ký tự, hiểu sự khác biệt giữa số byte UTF-8 và số ký tự là quan trọng. "Hello" là 5 ký tự và 5 byte trong UTF-8, nhưng "こんにちは" là 5 ký tự nhưng 15 byte (3 byte × 5 ký tự). Vì kích thước cột cơ sở dữ liệu và giới hạn kích thước tệp thường được chỉ định bằng byte, cần biết cả số ký tự và số byte. Hiển thị cả hai trong công cụ đếm ký tự giúp người dùng xử lý các ràng buộc khác nhau.

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