Vào năm 1987, một nhóm kỹ sư máy tính đã cố gắng đưa ra lời giải và cuối cùng, họ đã tạo ra Unicode, một bộ ký tự có thể biểu diễn gần như tất cả các ký tự trên thế giới. Bộ ký tự này gán mỗi ký tự một “điểm mã” (là số thập lục phân) và một cái tên.
Ví dụ, ký tự “ą” được gán cho điểm mã “U+0105” và được đặt tên là “Chữ A nhỏ Latinh có dấu móc câu”. Có một ký tự trông giống ký tự “ą” trong 13 ngôn ngữ khác nhau, như tiếng Ba Lan và tiếng Litva. Do đó, theo Unicode, chữ “ą” trong từ “robią” của tiếng Ba Lan và chữ “ą” trong từ “aslą” của tiếng Litva đều là cùng một ký tự. Unicode tiết kiệm bộ nhớ bằng cách thống nhất ký tự của các ngôn ngữ khác nhau.
Tuy nhiên, vẫn còn khá nhiều ký tự cần được mã hóa. Vào năm 1991, bộ ký tự Unicode ban đầu có 7.129 ký tự được đặt tên nay đã tăng lên 137.929 ký tự vào năm 2019. Phần lớn các ký tự đó là văn tự trong tiếng Trung, tiếng Nhật và tiếng Hàn, chẳng hạn như “U+6728” dùng để chỉ chữ “木”, nghĩa là gỗ hoặc cây. Unicode cũng bao gồm hơn 1.200 biểu tượng cảm xúc (“U+1F389” = “🎉”).
Tuy nhiên, Unicode là một bộ ký tự, không phải một bảng mã. Rất may, một nhóm kỹ sư khác đã giải quyết được vấn đề mã hóa Unicode thành dạng nhị phân một cách hiệu quả.
UTF-8
Vào năm 1992, các nhà khoa học máy tính đã phát minh ra UTF-8, một bảng mã tương thích với bảng mã ASCII và giải quyết được các hạn chế của ASCII.
UTF-8 có thể mô tả mọi ký tự theo tiêu chuẩn Unicode bằng cách sử dụng 1, 2, 3 hoặc 4 byte.
Khi một chương trình máy tính đang đọc tệp văn bản UTF-8, chương trình này sẽ biết có bao nhiêu byte biểu diễn ký tự tiếp theo dựa trên số lượng bit nhận số
1
mà chương trình tìm thấy.Số byte | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|
1 | 0xxxxxxx |
|||
2 | 110xxxxx |
10xxxxxx |
||
3 | 1110xxxx |
10xxxxxx |
10xxxxxx |
|
4 | 11110xxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
Nếu bit đầu tiên bên trái không nhận số
1
(nhận số 0
), chương trình sẽ hiểu ký tự này được biểu diễn bằng một byte. 7 bit còn lại trong byte được sử dụng để biểu diễn 128 ký tự ASCII gốc. Điều đó có nghĩa là chuỗi ký tự ASCII 8 bit cũng là chuỗi UTF-8 hợp lệ.Hai byte bắt đầu bằng
110
được sử dụng để mã hóa phần bảng chữ cái Latin, gồm cả các chữ cái cơ bản từ A đến Z và cả các biến thể của bảng chữ cái Latin (ví dụ như tiếng Tây Ban Nha và tiếng Đức) cùng với các ngôn ngữ khác như tiếng Hy Lạp, tiếng Do Thái và tiếng Ả Rập. Ba byte bắt đầu bằng 1110
sẽ mã hóa hầu hết các ký tự của các ngôn ngữ Châu Á (như tiếng Trung, tiếng Nhật và tiếng Hàn). Bốn byte bắt đầu bằng 11110
sẽ mã hóa mọi ký tự khác từ những chữ viết lịch sử hiếm khi được sử dụng cho đến những biểu tượng cảm xúc phổ biến.Tiêu chuẩn mã hóa UTF-8 hiện là bảng mã phổ biến cho các tệp HTML trên web, chiếm 94,5% số trang web tính đến tháng 12 năm 2019.
🔎Khi nhấp chuột phải vào bất kì vị trí nào trên trang web này và chọn “View page source” (“Xem nguồn trang”), khi tìm kiếm chuỗi “utf-8”, bạn sẽ thấy trang web này được mã hoá dưới dạng UTF-8 .
Nhìn chung, một bảng mã tốt là bảng mã có thể biểu diễn nhiều thông tin nhất với ít số bit nhất. UTF-8 là một ví dụ điển hình vì công cụ này có thể mã hóa các chữ cái tiếng Anh thông dụng chỉ với 1 byte và cũng rất linh hoạt trong việc sử dụng thêm byte để mã hóa hàng nghìn chữ cái khác.
Tuy nhiên, bảng mã UTF-8 không phải là bảng mã duy nhất. UTF-16 và UTF-32 là các bảng mã cũng có khả năng biểu diễn tất cả các ký tự Unicode. Ngoài ra, ta cũng có các bảng mã dành riêng cho các ngôn ngữ như Shift-JIS cho tiếng Nhật. Các chương trình máy tính có thể sử dụng bảng mã phù hợp nhất với nhu cầu và hạn chế của mình.