ASCII gốc và nhu cầu dùng nhiều ngôn ngữ
**ASCII gốc** dùng 7 bit, có $2^7=128$ mã cho chữ Latin không dấu, chữ số, dấu và một số mã điều khiển. Ví dụ chữ hoa `A` có mã thập phân 65, viết bằng 8 bit là `01000001` khi đặt trong một byte. Các bộ mã 8 bit mở rộng thêm 128 vị trí nhưng phần mở rộng có nhiều cách gán khác nhau; chỉ nói “ASCII mở rộng” chưa xác định mọi chữ tiếng Việt.
**Unicode** gán mã chung cho kí tự của nhiều hệ chữ. **UTF-8** là một cách biến mã Unicode thành dãy byte để lưu/truyền văn bản. Nhờ đó, tệp có thể chứa chữ Việt cùng chữ của ngôn ngữ khác mà không phải đổi bảng mã theo từng đoạn.
Bài luyện
ASCII gốc dùng 7 bit. Tối đa có bao nhiêu mã khác nhau?
Số bit không bằng số tổ hợp.
Cần tính lũy thừa của 2.
256 là số tổ hợp của 8 bit.
$2^7=128$ tổ hợp.
Lời giải
Mỗi bit có hai khả năng. Với 7 bit, số dãy khác nhau là $2^7=128$, từ `0000000` đến `1111111`.
Một kí tự không nhất thiết là một byte
UTF-8 dùng **1–4 byte cho một mã Unicode**; số byte tùy kí tự. Ví dụ đã kiểm bằng Python với chuỗi được gõ như bảng:
| Kí tự | Mã Unicode | UTF-8 | Số byte |
|---|---|---|---:|
| `A` | U+0041 | `41` | 1 |
| `đ` | U+0111 | `C4 91` | 2 |
| `ấ` | U+1EA5 | `E1 BA A5` | 3 |
Các số trong cột UTF-8 viết ở hệ thập lục phân, mỗi cặp là **một byte**. Vì `đ` dùng 2 byte còn `ấ` dùng 3 byte, câu “mọi chữ tiếng Việt có dấu đều dùng 2 byte” là không đúng. Có chữ nhìn giống nhau nhưng được lưu bằng một mã dựng sẵn hoặc nhiều mã ghép dấu; khi ấy số byte của cả chuỗi cũng có thể khác.
Bài luyện
Trong bảng trên, chữ `ấ` chiếm bao nhiêu byte khi mã hóa UTF-8 theo đúng dạng đã cho?
Một byte áp dụng cho `A` trong bảng.
`ấ` có ba cặp byte trong bảng.
`E1 BA A5` gồm ba byte.
Bảng chỉ có ba cặp byte cho chữ này.
Lời giải
Dãy UTF-8 của `ấ` trong bảng là `E1 BA A5`. Ba cặp thập lục phân tương ứng ba byte.
Bài luyện
Điều nào giải thích đúng quan hệ giữa Unicode và UTF-8?
Đây là hai vai trò cần phân biệt.
Phông chữ quyết định hình dạng hiển thị, không phải nhiệm vụ của Unicode.
ASCII gốc chỉ có 128 mã.
UTF-8 có độ dài biến đổi.
Lời giải
Unicode xác định mã kí tự, còn UTF-8 quy định dãy byte để lưu mã đó. Vì vậy cùng là văn bản Unicode, số byte của từng kí tự có thể khác nhau.
Đang học