Revision 2018. Bài này chỉnh lý và cải tiến phiên bản 2017 (xem #12).
Định dạng sơ khai và hoàn thiện, về hình thức vẫn như trước, nhưng về ngữ nghĩa có thay đổi, nên để tránh nhầm lẫn mình gọi định dạng sơ khai mới là dạng chuẩn, còn định dạng hoàn thiện mới là dạng mã.
Nhắc lại #12, dạng chuẩn là
Code:
v1 v2 v3 v4 v5 v6 v7 v8 t1 t2 t3 p1 p2 p3 p4 p5
trong đó v1 - v8 là mã âm vần, t1 - t3 là mã thanh, p1 - p5 là mã phụ âm đầu. Và dạng mã là
Code:
u1 u2 v3 v4 v5 v6 v7 v8 s1 s2 t3 p1 p2 p3 p4 p5
Điểm mới ở đây là công thức biến đổi giữa hai dạng:
Code:
u1 u2 s1 s2 = ~v1 ~v2 t1 ~t2
Công thức mới đơn giản hơn hẳn trước. Sở dĩ thế là vì v1 = 0. Nói cách khác, dạng chuẩn thực chất chỉ có 15 bit. Làm sao được thế?
Một cách vắn tắt, trong dạng chuẩn, 72 âm vần khép và 72 âm vần nửa khép sáp nhập với nhau thành 72 âm vần lưỡng tính, và 2 thanh nhập được tách ra khỏi 2 thanh khứ. Nhắc lại #3, sắc và nặng được gọi chung là nhập trong các vần khép, gọi chung là khứ trong 3 loại vần còn lại. Nay, sắc được chia thành "sắng" và sắc, còn nặng thành nặng và "nặc". Vậy, dạng chuẩn chỉ còn 120 âm vần, nhưng lại có những 8 thanh. Bản đồ quy hoạch không gian (dạng chuẩn) vẫn có 7 ô, nhưng có dạng "đẹp" hơn, nghĩa là dễ mã hóa hơn.
Dù 1 mã âm vần có thể xác định 2 âm vần (1 khép, 1 nửa khép), tính khép/nửa khép vẫn được xác định hoàn toàn bằng mã thanh. Nên mã vần (và do thế, cả mã chữ) là không nhập nhằng. Ví dụ, bắn và bắt tuy cùng mã âm vần nhưng vẫn khác nhau ở mã thanh.
Bảng 2b. Tám thanh
Code:
0 1 2 3 4 5 6 7
------------------------------------------------
ngang huyền hỏi ngã sắng nặng sắc nặc
bằng bằng gãy gãy khứ khứ nhập nhập
phù trầm phù trầm phù trầm phù trầm
Bảng 3b. Tập hợp 120 âm vần
Code:
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F
===================================================================================
0_ a oa ơ uơ ưa e oe ê uê ia uya o ô ua u ư
ua ue
1_ i y uy ai oai ay oay ơi uơi ươi ây uây oi ôi uôi ui
uai uay
2_ ưi ao oao au oau ươu âu uâu eo oeo êu uêu iêu ưu iu uyu
uao uau ueo yêu
3_ uơm uâm oem uym uơng oeng uêng uyêng
uơp uâp oep uyp uơc oec uêc uyêc
4_ an oan ăn oăn ơn uơn ươn ân uân en oen ên uên iên uyên on
at oat ăt oăt ơt uơt ươt ât uât et oet êt uêt iêt uyêt ot
5_ ôn uôn un ưn in uyn am oam ăm oăm ơm ươm âm em êm uêm
ôt uôt ut ưt it uyt ap oap ăp oăp ơp ươp âp ep êp uêp
6_ iêm om ôm uôm um ưm im ang oang ăng oăng ơng ương âng uâng eng
iêp op ôp uôp up ưp ip ac oac ăc oăc ơc ươc âc uâc ec
7_ iêng êng ong oong ông uông ôông ung ưng ing anh oanh ênh uênh inh uynh
iêc êc oc ooc ôc uôc ôôc uc ưc ic ach oach êch uêch ich uych
Hình 4b. Bản đồ quy hoạch không gian chuẩn (nửa trên, phóng to)
Code:
+-----------------------------------+
| t1 t2 |
+--------+--------+--------+--------+
| 00 | 01 | 10 | 11 |
+--+--+--------+--------+--------+--------+
| | | | | | |
| | | 48 âm vần [nửa] mở | |
| |00| với 6 thanh | |
| | | bằng | gãy | khứ | |
| | +--------+--------+--------+ |
|v1| +--------+--------+--------+--------+
| +--+ + + + +
|v2| | | | | |
| | | |
| |01| 72 âm vần [nửa] khép |
| | | với 8 thanh |
| | | |
| | | bằng | gãy | khứ | nhập |
+--+--+--------+--------+--------+--------+
Hình 5b. Bản đồ quy hoạch không gian mã
Code:
+-----------------------------------+
| s1 s2 |
+--------+--------+--------+--------+
| 00 | 01 | 10 | 11 |
+--+--+--------+--------+--------+--------+
| | | | | | |
| |00| | |
| | | hai | ký tự ASCII |
| +--+- ký tự -+- và byte đầu -+
| | | ASCII | ký tự đa byte |
| |01| | |
|u1| | | | | |
| +--+--------+--------+--------+--------+
|u2| | chữ | chữ | chữ | chữ |
| |10| Việt Việt Việt Việt |
| | | 0101 | 0100 | 0111 | 0110 |
| +--+-- --+-- --+-- --+-- --+
| | | chữ | chữ | chữ | chữ |
| |11| Việt Việt Việt Việt |
| | | 0001 | 0000 | 0011 | 0010 |
+--+--+--------+--------+- hoặc -+--------+
2 byte đầu ký tự UTF-8+
Các chữ Việt tạo bởi 8 âm vần khép hiếm và 2 thanh nhập (v1 v2 t1 t2 = 0011) được mã hóa vào cùng một ô với [2 byte đầu] ký tự UTF-8+ (u1 u2 s1 s2 = 1110), nhưng không đụng độ với UTF-8. Thật vậy, chúng có mã [nhị phân] là 11111xxx 10xxxxxx, trong khi ký tự UTF-8+ chỉ có dạng 110xxxxx 10xxxxxx (ký tự 2 byte), 1110xxxx 10xxxxxx... (ký tự 3 byte), 11110xxx 10xxxxxx... (ký tự 4 byte). (Xem Hình 5c.) Nói rõ hơn, các chữ Việt như thế chiếm chỗ của ký tự UTF-8 bất hợp lệ, cụ thể là chỗ từng được dành cho [2 byte đầu] ký tự UTF-8+ dài 5 byte (111110xx 10xxxxxx...) hoặc 6 byte (1111110x 10xxxxxx...). Nhắc lại lịch sử, UTF-8 nguyên thủy được quy hoạch với độ dài từ 1 đến 6 byte, đủ cho Unicode đến 2^31 điểm mã. Sau này, khi Unicode được giới hạn với tối đa 2^21 điểm mã, UTF-8 cũng được giới hạn tương ứng với độ dài tối đa là 4 byte, còn các ký tự 5 byte và 6 byte, vốn chưa hề được định nghĩa, đã trở thành bất hợp lệ.
Hình 5c. Bản đồ quy hoạch không gian mã (nửa dưới, phóng to)
Code:
+-----------------------------------+
| s1 s2 |
+--------+--------+--------+--------+
| 00 | 01 | 10 | 11 |
+--+--+--------+--------+--------+--------+
| | | | | | |
| | | 64 64 64 64 |
| | | [nửa] [nửa] [nửa] [nửa] |
| |10| khép khép khép khép |
| | | gãy bằng nhập khứ |
|u1| | | | | |
| +--+- -+- -+--------+- -+
|u2| | 48 | 48 | | 48 |
| | | [nửa] [nửa] | 2 byte | [nửa] |
| |11| mở mở | đầu | mở |
| | | gãy | bằng | ký tự | khứ |
| | +--------+--------+ UTF-8+ +--------+
| | +--------+--------+--------+--------+
+--+--+----^---+----^---+----^---+---^----+
| | | |
8 8 8 8
[nửa] [nửa] [nửa] [nửa]
khép khép khép khép
gãy bằng nhập khứ
Việc cải tiến mã này nhằm đơn giản hóa, nghĩa là làm cho dạng mã bám sát dạng chuẩn, từ đó tăng tốc độ xử lý dữ liệu ở dạng mã hay dạng chuẩn (mà không cần giải mã thành xâu UTF-8). Nó vẫn hướng đến mục tiêu chung được đặt ra từ đầu là xử lý dữ liệu thật nhanh, mục đích tối hậu của việc mã hóa (hơn là nén nhờ một thuật toán vạn năng) tiếng Việt nói riêng và dữ liệu nói chung trong các hệ thống thông tin.