2. Mã ký tự
Ta sẽ mã hóa mỗi chữ Việt như 1 ký tự.
Từ các bảng 192 âm vần, 6 thanh và 32 phụ âm đầu, ý tưởng sơ khai hiển nhiên là mã hóa một chữ Việt bằng 2 octet có dạng
v1...v8 t1...t3 p1...p5
trong đó v1...v8 là 8 bit biểu diễn âm vần (theo bảng 3), t1...t3 là 3 bit biểu diễn thanh (theo bảng 2), p1...p5 là 5 bit biểu diễn phụ âm đầu (theo bảng 1).
Ý tưởng này được thể hiện trong bảng 4. Trong đó không gian mọi giá trị 16 bit được phân hoạch thành 16 ô ứng với 16 giá trị khả dĩ của t1 t2 v1 v2. Các ô với t1 t2 = 11 hay v1 v2 = 11 không sử dụng là hiển nhiên. Các ô có t1 = 0 và v1 v2 = 10 không sử dụng bởi vì t1 = 0 ứng với thanh bằng hay thanh gãy, và v1 v2 = 10 ứng với 64 âm vần khép, tổ hợp mà ta đã biết là không tồn tại trong tiếng Việt.
Bảng 4. Bản đồ quy hoạch không gian mã (sơ khai).
Code:
+-----------------------------------+
| v1 v2 |
+--------+--------+--------+--------+
| 00 | 01 | 10 | 11 |
+--+--+--------+--------+--------+--------+
| | | | | | |
| |00| chữ | chữ | | |
| | | Việt | Việt | | |
| | | | | | |
| +--+--------+--------+--------+--------+
| | | | | | |
| |01| chữ | chữ | | |
| | | Việt | Việt | | |
|t1| | | | | |
| +--+--------+--------+--------+--------+
|t2| | | | | |
| |10| chữ | chữ | chữ | |
| | | Việt | Việt | Việt | |
| | | | | | |
| +--+--------+--------+--------+--------+
| | | | | | |
| |11| | | | |
| | | | | | |
| | | | | | |
+--+--+--------+--------+--------+--------+
Như vậy, trong 16 ô chỉ có 7 ô được dùng để mã hóa tiếng Việt. Còn lại 9 ô, mình tận dụng để mã hóa thông tin khác:
-- Đôi ký tự ASCII (tức là một xâu gồm 2 ký tự ASCII). Mỗi ký tự ASCII cần 7 bit. Hai ký tự dùng hết 14 bit. Dùng hết 4 ô.
-- Ký tự Unicode từ U+0000 đến U+3FFF. Mỗi ký tự như thế cần 14 bit. Dùng hết 4 ô.
-- Còn 1 ô, mã hóa một nửa ký tự Unicode có số thứ tự từ U+4000 trở lên.
Mọi ký tự ASCII bất kể đơn lẻ hay đi thành đôi với ký tự ASCII khác đều được biểu diễn bằng một octet trọn vẹn với bit đầu tiên (bit cao nhất) bằng 0 và bảy bit còn lại là mã ký tự. Đây là một phương pháp truyền thống, đã được áp dụng trong hàng trăm hệ mã (đơn octet và đa octet). Truyền thống đó đảm bảo tương thích giữa các hệ mã, nhờ thế mà 1 xâu ASCII có cơ hội được giải mã đúng, tìm kiếm đúng, hiển thị đúng kể cả khi chương trình ứng dụng không biết hệ mã thực sự đã dùng.
Một đôi ký tự ASCII như thế sẽ tương ứng với t1 v1 = 00, nghĩa là đụng độ với chữ Việt trong bản đồ quy hoạch không gian mã (bảng 4). Để giải quyết đụng độ, phần "chữ Việt" trong bản đồ nói trên được "lật" sang phía bên phải (xem bảng 5).
Bảng 5. Bản đồ quy hoạch không gian mã (hoàn thiện).
Code:
+-----------------------------------+
| v1 v2 |
+--------+--------+--------+--------+
| 00 | 01 | 10 | 11 |
+--+--+--------+--------+--------+--------+
| | | | | | |
| |00| | |
| | | | |
| | | đôi | |
| +--+- ký tự -+- -+
| | | ASCII | |
| |01| | chữ |
| | | | Việt |
|t1| | | | |
| +--+--------+--------+- -+
|t2| | nửa | | |
| |10| ký tự | |
| | |U+4000 | |
| | |trở lên | | | |
| +--+--------+--------+--------+--------+
| | | | | | |
| |11| |
| | | ký tự U+0000...U+3FFF |
| | | | | | |
+--+--+--------+--------+--------+--------+
Việc "lật sang phía bên phải" nói trên có thể được thực hiện bằng bất cứ phép biến đổi bit nào lật ngược bit v1. Ở đây để đơn giản hóa mô tả, ta lật ngược 2 bit v1 v2. Nói cách khác, trong định dạng hoàn thiện, một chữ Việt được mã hóa bằng 16 bit với định dạng như đã nêu trong ý tưởng sơ khai nói trên, nhưng với v1 v2 lật ngược.