[Programming] một phương pháp mã hoá tiếng Việt (st) |
29/08/2010 22:05:59 (+0700) | #1 | 219367 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
MỘT PHƯƠNG PHÁP MÃ HÓA TIẾNG VIỆT
Nguồn: Ada at congdongcviet.com
Đây là một phương pháp mã hóa xâu ký tự do mình tự sáng tạo ra. Nó có thể mã hóa mọi xâu ký tự, nhưng đối với các xâu tiếng Anh hay ngôn ngữ khác thì chỉ đạt được hiệu quả như các phương pháp mã hóa xâu ký tự thông thường như xâu octet, UCS-2, UTF-8, UTF-16,... Chỉ khi dữ liệu là tiếng Việt mới thực sự đạt được hiệu quả cao -- gấp mấy lần. Có thể coi nó là một phương pháp nén dữ liệu đơn giản chuyên dùng cho tiếng Việt.
Nó lưu tiếng Việt ở dạng tách rời 3 thành phần: phụ âm đầu, thanh, âm vần và không phân biệt chữ hoa hay thường, nhờ đó thông tin viết bằng tiếng Việt được chuẩn tắc hóa tốt, giúp thông tin thêm chính xác, thêm nhất quán và giúp việc tìm kiếm đầy đủ, trọn vẹn. Nó là một phương pháp hướng byte (hay nói một cách chính xác, hướng octet), nên việc giải mã rất đơn giản và rất nhanh. Nó còn hỗ trợ tìm kiếm xâu (string matching) trực tiếp ở dạng mã hóa mà không cần giải mã. Vì thế nó đặc biệt thích hợp cho việc lưu trữ dữ liệu để truy vấn, chẳng hạn, trong các hệ thống thông tin.
Xâu đã mã hóa rồi vẫn có thể nén tốt bằng các kỹ thuật nén thông thường, giúp cho việc truyền tải dễ dàng.
Mỗi xâu được nối từ nhiều xâu thuộc 1 trong 3 loại: (1) xâu ký tự ASCII (2) xâu ký tự Unicode và (3) xâu chữ Việt.
Mỗi chữ Việt được mã hóa bằng 2 octet. Mỗi đôi ký tự ASCII được mã hóa bằng 2 octet. Mỗi ký tự Unicode nhỏ hơn U+4000 (kể cả một ký tự ASCII đơn lẻ) được mã hóa bằng 2 octet. Mỗi ký tự Unicode từ U+4000 trở lên được mã hóa bằng 4 octet.
1. Một số khái niệm về tiếng Việt
Mỗi chữ Việt cấu thành từ phụ âm đầu và vần. Ví dụ, toàn có phụ âm đầu là t, vần là oàn.
Vần cấu thành từ thanh và âm vần. Ví dụ, oàn có thanh huyền, âm vần oan.
Âm vần có 3 thành phần là âm đệm, chủ âm, và âm cuối. Ví dụ, oan có âm đệm là w, chủ âm là a, âm cuối là n.
Để ý rằng các ký hiệu mà mình sử dụng là chữ cái bình thường hơn là ký hiệu phiên âm, bởi 3 lý do. Thứ nhất, để dễ hiểu hơn đối với giới lập trình viên. Thứ hai, phương pháp mã hóa ở đây là để mã hóa chữ (một bài toán chính tả) chứ không phải là mã hóa phiên âm (bài toán ngữ âm học hay âm vị học). Thứ ba, với một số âm tiếng Việt những học giả khác nhau phiên âm khác nhau. Tuy vậy, đối với các âm đệm và âm cuối, mình dùng ký hiệu phiên âm -- w thay cho u, o còn j thay cho i, y -- để nhấn mạnh bản chất của chúng là những phụ âm, khác hẳn với chủ âm vốn dĩ luôn là một nguyên âm.
Phụ âm đầu, âm đệm và âm cuối đều có thể là âm trống (còn gọi là âm không trong ngữ âm học), biểu thị cho cái "không có gì" và được viết bằng một xâu trống. Ví dụ, a, ia, ai, ơi, oa, oan, yêu là những chữ không có phụ âm đầu; trong đó, a, ai, ơi không có âm đệm còn ia, oa, oan, yêu thì có; và trong đó, a, ia, oa không có âm cuối còn ai, ơi, oan, yêu thì có.
Tiếng Việt là một trong những ngôn ngữ mà mọi âm tiết đều có một nguyên âm, nói cách khác, chủ âm không thể là âm trống.
Bảng 1. Tập hợp 32 phụ âm đầu, kể cả phụ âm trống.
Code:
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F
=================================================================================
0_ -- b c ch d dz đ f g/gh gi h j k kh l m
1_ n ng/ngh nh p ph q r s t th tr v w x y z
Để ý rằng các chữ đồng âm có khi được mã hóa bằng cùng một mã (g và gh, ng và ngh) nhưng cũng có khi bằng những mã khác nhau (c, k và q đồng âm, d và z đồng âm, f và ph đồng âm, gi và j đồng âm). Ngoài ra còn có những phụ âm lạ không có trong tiếng Việt "thông thường" như dz, f, j, p, w, z. Sau này, trong bảng mã vần ta cũng sẽ thấy xuất hiện nhiều vần rất "lạ mắt". Lý do của cách mã hóa như thế là cố gắng tiết kiệm mã nhưng đồng thời cố gắng trung thành với nguyên bản (loại trừ nhập nhằng chính tả) các danh từ riêng và các từ phát âm theo lối địa phương, thường là trong văn học và báo chí, chẳng hạn như Sa Pa, Pác Bó, Bắc Kạn, Đa Kao, Plây - ku, Ja-wa, Liang Wiang, Yang Fong, Nguyễn Sinh Côông, Lý Woòng, Hồ Dzếch, Kuốc Zũng, Siu Black,...
Có 13 chủ âm, là a, ơ, e, ê, o, ô, u, ư, i, ă (tức a ngắn), â (tức ơ ngắn), oo (tức o dài), và ôô (tức ô dài).
Có 2 phụ âm có thể là âm đệm hay âm cuối, còn gọi là nửa nguyên âm, j và w. Ví dụ, âm đệm j có mặt trong ưa (tức j-ơ), ươn, ia (tức j-ê), yên; âm đệm w có mặt trong oa, oăn, uơ, oe/ue, uây, ua (tức w-ô), uôn, uy; âm cuối j có mặt trong ai, ơi, oi, ôi, ui, ưi, oay, uây; âm cuối w có mặt trong ao, au, ươu, âu, eo, yêu, ưu, iu, uyu. Ngoài ra, wj cũng là một âm đệm (wj-ê trong uya, uyên, uyêt).
Có 8 phụ âm có thể là âm cuối, chia thành 2 loại: phụ âm vang, gồm n, m, ng, nh, và phụ âm không vang, gồm t, p, c, ch.
Tương ứng với loại âm cuối, vần được chia thành 4 loại. Vần tận cùng bằng âm trống gọi là vần mở. Vần tận cùng bằng nửa nguyên âm gọi là vần nửa mở. Vần tận cùng bằng phụ âm vang gọi là vần nửa khép. Vần tận cùng bằng phụ âm không vang gọi là vần khép. Ví dụ, a, oa, ơ, uơ, ưa, e, oe, ê, uê, ia, uya, u, ư, i, uy là những vần mở; ai, oai, ay, oay, ơi, uơi, ươi, ây, uây, oi, ôi, uôi, ui, ưi, ao, au, oau, ươu, âu, uâu, eo, oeo, êu, uêu, iêu, ưu, iu, uyu là những vần nửa mở; an, iên, em, iêm, ông, ương, inh, uynh là những vần nửa khép; at, iêt, ep, iêp, ôc, ươc, ich, uych là những vần khép.
Có 6 thanh: ngang, huyền, hỏi, ngã, sắc, nặng. Ngang huyền gọi chung là thanh bằng. Hỏi ngã được gọi chung là thanh gãy (còn gọi là thanh nghẽn). Thanh bằng và thanh gãy không bao giờ xuất hiện trong vần khép, chỉ có trong vần mở, nửa mở và nửa khép mà thôi. Sắc nặng xuất hiện trong mọi vần; trong vần mở, nửa mở và nửa khép chúng được gọi là thanh khứ, còn trong vần khép được gọi là thanh nhập.
Bảng 2. Sáu thanh
Code:
0 1 2 3 4 5
------------------------------------------------
ngang huyền hỏi ngã sắc nặng
Tổ hợp tất cả các âm đầu (kể cả trống), âm chính và âm cuối (kể cả trống) theo quy tắc ghép âm sẽ được mọi âm vần, kể cả một số vần hiếm đủ để mã hóa cả văn chương, báo chí Việt, như bảng sau đây.
Bảng 3. Tập hợp 192 vần của tiếng Việt.
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 ư
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ê- uơp uâp oep uyp uơc oec uêc uyêc
uem ueng ng uep uec
4_ an oan ăn oăn ơn uơn ươn ân uân en oen ên uên iên uyên on
uan uăn uen yên
5_ ôn uôn un ưn in uyn am oam ăm oăm ơm ươm âm em êm uêm
uam uăm
6_ iêm om ôm uôm um ưm im ang oang ăng oăng ơng ương âng uâng eng
yêm uang uăng
7_ iêng êng ong oong ông uông ôông ung ưng ing anh oanh ênh uênh inh uynh
yêng uanh
8_ at oat ăt oăt ơt uơt ươt ât uât et oet êt uêt iêt uyêt ot
uat uăt uet yêt
9_ ôt uôt ut ưt it uyt ap oap ăp oăp ơp ươp âp ep êp uêp
uap uăp
A_ iêp op ôp uôp up ưp ip ac oac ăc oăc ơc ươc âc uâc ec
yêp uac uăc
B_ iêc êc oc ooc ôc uôc ôôc uc ưc ic ach oach êch uêch ich uych
yêc uach
Cấu trúc của bảng này có thể tóm tắt sơ lược trong vài câu.
00 - 3F gồm 48 âm vần mở / nửa mở, 8 âm vần nửa khép hiếm và 8 âm vần khép hiếm.
40 - 7F gồm 64 âm vần nửa khép.
80 - BF gồm 64 âm vần khép.
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ữ | | |
|t1| | Việt | Việt | | |
| +--+--------+--------+--------+--------+
|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ữ |
|t1| | | Việt |
| +--+--------+--------+- -+
|t2| | nửa | | |
| |10| ký tự | |
| | |U+4000+ | |
| +--+--------+--------+--------+--------+
| | | | | | |
| |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.
Một cách chi tiết, mỗi cặp octet trong xâu đã mã hóa có ý nghĩa như sau.
- 0xxxxxxx 0yyyyyyy biểu diễn một xâu gồm 2 ký tự ASCII, với mã lần lượt là xxxxxxx yyyyyyy.
-
- 10vvvvvv 00tppppp biểu diễn một chữ Việt có âm vần = 01vvvvvv, thanh = 00t, phụ âm đầu = ppppp, tức thanh bằng và âm vần nửa khép.
-
- 11vvvvvv 00tppppp biểu diễn một chữ Việt có âm vần = 00vvvvvv, thanh = 00t, phụ âm đầu = ppppp, tức thanh bằng và âm vần mở, nửa mở hay nửa khép hiếm.
-
- 10vvvvvv 01tppppp biểu diễn một chữ Việt có âm vần = 01vvvvvv, thanh = 01t, phụ âm đầu = ppppp, tức thanh gãy và âm vần nửa khép.
-
- 11vvvvvv 01tppppp biểu diễn một chữ Việt có âm vần = 00vvvvvv, thanh = 01t, phụ âm đầu = ppppp, tức thanh gãy và âm vần mở, nửa mở hay nửa khép hiếm.
-
- 00xxxxxx 10yyyyyy biểu diễn một phần của một ký tự Unicode có số thứ tự từ U+4000 trở lên. Ký tự có số thứ tự xxxxxxyyyyzzzzzzuuuuu + 0x4000 biểu diễn bằng 000uuuuu 10zzzzzz 0010yyyy 10xxxxxx. Chú ý rằng những mã trị có dạng 0011xxxx 10yyyyyy không được định nghĩa.
-
- 01vvvvvv 10tppppp biểu diễn một chữ Việt có âm vần = 10vvvvvv, thanh = 10t, phụ âm đầu = ppppp, tức thanh nhập và âm vần khép.
-
- 10vvvvvv 10tppppp biểu diễn một chữ Việt có âm vần = 01vvvvvv, thanh = 10t, phụ âm đầu = ppppp, tức thanh khứ và âm vần nửa khép.
-
- 11vvvvvv 10tppppp biểu diễn một chữ Việt với âm vần = 00vvvvvv, thanh = 10t, phụ âm đầu = ppppp, tức thanh khứ và âm vần mở, nửa mở, nửa khép hiếm, hoặc thanh nhập và âm vần khép hiếm.
-
- xxxxxxxx 11yyyyyy biểu diễn ký tự Unicode có số thứ tự yyyyyyxxxxxxxx, tức là một ký tự trong khoảng U+0 đến U+3FFF. Chú ý rằng 0xxxxxxx 11000000 cũng đồng thời biểu diễn 1 ký tự ASCII đơn lẻ có mã xxxxxxx.
3. Mã hóa xâu
Để mã hóa một xâu, ta phân tích nó thành các xâu con và xác định loại cho chúng: xâu chữ Việt, xâu ASCII hay xâu Unicode. Xâu chữ Việt là xâu gồm các chữ Việt phân cách nhau bởi 1 dấu trắng hoặc không được phân cách. Xâu ASCII là xâu mà mọi ký tự đều có mặt trong bảng ASCII. Xâu Unicode là xâu mà mọi ký tự đều có mặt trong bảng Unicode. (Trường hợp giữa hai chữ Việt có hai hay nhiều dấu trắng hơn, hay giữa hai chữ Việt có những dấu cách hay dấu ngăn khác thì những dấu này được xem như những xâu ASCII hay Unicode chen giữa 2 xâu chữ Việt.) Rồi ta mã hóa từng xâu con như sau.
- Với xâu chữ Việt, ta phân tích từng chữ thành 3 thành phần phụ âm đầu, âm vần và thanh, rồi mã hóa từng thành phần. Một dấu trắng phân cách 2 chữ Việt sẽ được mã hóa thành xâu trống (nói cách khác, dấu trắng ta bỏ qua). Giữa hai chữ Việt không phân cách, ta xem như có 1 xâu trống và mã hóa xâu trống này bằng một mã nào đó mà ta quy ước dành riêng cho việc này (chẳng hạn, 0000, 00C0 hoặc 200B).
-
- Với xâu ASCII, ta mã hóa từng đôi ký tự thành 2 octet, còn ký tự lẻ cuối xâu (nếu có) thì mã hóa thành 1 octet và nối thêm vào 1 octet với giá trị C0 (tức 11000000 nhị phân).
-
- Với xâu Unicode, ta mã hóa từng ký tự thành 2 hay 4 octet.
Định nghĩa xâu chữ Việt, xâu ASCII và xâu Unicode như trên là đúng đắn nhưng hiển nhiên là chưa cho phép xác lập một thuật toán mã hóa tất định. Một ví dụ kinh điển, NHA MAY CO KHI GIA LAM là một xâu chữ Việt, đồng thời cũng là một xâu ASCII, và cũng là một xâu Unicode. Và còn có nhiều cách hiểu khác, ví dụ NHA và CO được hiểu là những xâu con chữ Việt, MAY và KHI được hiểu là những xâu con ASCII, còn GIA LAM được hiểu là xâu con Unicode. Có bao nhiêu cách hiểu sẽ có bấy nhiêu kết quả mã hóa khác nhau!
Để xây dựng một thuật toán mã hóa tất định, cần đặt ra thêm các tiêu chuẩn khác để xác định loại xâu. Ví dụ:
(1) Ưu tiên chữ Việt và ASCII hơn Unicode: một xâu chỉ được xem là xâu Unicode khi nó không thể là xâu chữ Việt hay xâu ASCII.
(2) Ưu tiên chữ Việt hơn ASCII: một xâu chỉ được xem là xâu ASCII khi nó không thể là xâu chữ Việt.
(3) Ưu tiên ASCII hơn chữ Việt: một xâu chỉ được xem là xâu chữ Việt khi nó không thể là xâu ASCII.
(4) Không ưu tiên một cách máy móc: dựa vào ngữ cảnh, dựa vào từ điển, dựa vào thông tin do người sử dụng cung cấp, phân tích hình thái, phân tích cú pháp hay các tiêu chuẩn heuristic phức tạp khác để xác định loại xâu.
Người lập trình tùy theo mục đích sử dụng mà xây dựng thuật toán mã hóa phù hợp. Để mã hóa một bản danh sách học sinh, (1) và (2) có thể là phù hợp. Để mã hóa một danh sách công ty đa quốc gia, (1) và (3) có thể là phù hợp. Để mã hóa một thư viện sách báo, có thể phải xây dựng một thuật toán phức tạp phối hợp cả 4 tiêu chuẩn trên. Việc trình bày thuật toán mã hóa cho từng ứng dụng cụ thể vượt ra ngoài khuôn khổ của bài này.
Dù thuật toán nào, để có thể tìm kiếm xâu con trực tiếp trên dữ liệu mã hóa, xâu cần tìm phải được mã hóa bằng chính thuật toán đã dùng để mã hóa dữ liệu.
4. Ví dụ
Ví dụ 1. 4E 6F 76 61 giải mã thành Nova.
Ví dụ 2. 31 2B 31 3D 32 C0 giải mã thành 1+1=2.
Ví dụ 3. C6 45 C6 31 C6 2D C6 28 C6 27 giải mã thành مرحبا, tức 06 45 06 31 06 2D 06 28 06 27 theo mã UCS-2 (là mã "big-endian Unicode" theo cách gọi của Microsoft).
Ví dụ 4. 18 A1 25 80 09 9C 23 80 giải mã thành 永安, tức 6C 38 5B 89 theo mã UCS-2.
Ví dụ 5. C4 B1 B2 89 giải mã thành Ngựa Gióng (hay ngựa gióng, NGỰA GIÓNG, ngỰA giÓng,... hiểu sao cũng được).
5. Đánh giá
Một xâu ký tự ASCII có độ dài là số chẵn được mã hóa thành xâu octet cùng độ dài (xem ví dụ 1). Một xâu ký tự ASCII có độ dài là số lẻ được mã hóa thành xâu octet chỉ dài hơn 1 octet (xem ví dụ 2). Như thế đối với các xâu ký tự ASCII, phương pháp mã hóa xâu của mình có hiệu quả tương đương với các phương pháp truyền thống (chẳng hạn như ISO 8859-15, TCVN3, hay UTF-8).
Một ký tự Unicode có số thứ tự không quá U+3FFF được mã hóa thành 2 octet. Đối với các xâu ký tự như thế (xem ví dụ 3), phương pháp của mình có hiệu quả ngang với UCS-2 và UTF-16, và đối với 14336 ký tự từ U+0800 đến U+3FFF thì hiệu quả hơn UTF-8 (vốn dĩ phải mã hóa bằng 3 octet).
Một ký tự Unicode có số thứ tự từ U+4000 trở lên được mã hóa bằng 4 octet. Như thế phương pháp của mình chỉ thua UCS-2 / UTF-16 đối với 49 152 ký tự từ U+4000 đến U+FFFF (xem ví dụ 4) còn đối với 1 048 576 ký tự từ U+10000 trở lên thì hiệu quả lại ngang với UTF-16.
Một chữ Việt được mã hóa bằng 2 octet (xem ví dụ 5). Biểu diễn bằng Unicode dựng sẵn (TCVN 6909:2001), một chữ Việt bình quân có khoảng 3-4 ký tự; khi mã hóa ở dạng UCS-2 / UTF-16 mỗi ký tự mất 2 octet. Như thế, đối với tiếng Việt, phương pháp của mình hiệu quả hơn các phương pháp thông thường chừng 3-4 lần.
Chú ý rằng Unicode dựng sẵn là một dạng mã hóa không chuẩn tắc, nghĩa là một chữ Việt thường có nhiều cách viết khác nhau do vị trí đánh dấu thanh và phân biệt chữ hoa / thường, gây khó khăn cho việc tìm kiếm thông tin. Còn Unicode tổ hợp (chuẩn đã dẫn), một cách mã hóa tiếng Việt khá chuẩn tắc, nhưng dài hơn nhiều, mà đem so sánh với phương pháp của mình thì sự khác biệt về hiệu quả còn rõ rệt hơn nhiều nữa.
(-THE END-) |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
30/08/2010 07:20:28 (+0700) | #2 | 219386 |
Mình chưa đọc hết kỹ thuật mã hoá (vì nó khá dài), mới đọc giới thiệu và đánh giá. Cho mình hỏi là mục đích phương pháp mã hoá này là để rút ngắn kích thước lưu trữ hơn là rút ngắn thời gian xử lý ? Ví dụ hàm UpperCase (chuyển chuỗi thành chữ hoa) sẽ chạy như thế nào ? |
|
Spam thêm một bài là góp một viên gạch xây diễn đàn lớn mạnh |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
30/08/2010 19:31:13 (+0700) | #3 | 219426 |
lamer
Elite Member
|
0 |
|
|
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
|
|
Mã hóa xong giải mã ra khác hẳn nhau (Ngựa Gióng NGỰA GIÓNG ngựa gióng như trong ví dụ) thì làm sao mà xài được đây?
Vả lại, hình như thiếu mất phụ âm "qu" thì phải? Hay là quân được hiểu là phụ âm q và vần uân? |
|
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
30/08/2010 20:27:32 (+0700) | #4 | 219428 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
invalid-password wrote:
Mình chưa đọc hết kỹ thuật mã hoá (vì nó khá dài), mới đọc giới thiệu và đánh giá. Cho mình hỏi là mục đích phương pháp mã hoá này là để rút ngắn kích thước lưu trữ hơn là rút ngắn thời gian xử lý ? Ví dụ hàm UpperCase (chuyển chuỗi thành chữ hoa) sẽ chạy như thế nào ?
Chào bạn. Alice đã đọc hết. Nhưng vì bạn mới đọc phần đầu và phần cuối nên alice chỉ dùng thông tin ở 2 phần đó để trao đổi với bạn. Alice nghĩ rằng mục đích của phương pháp mã hoá này là để chuẩn hoá data. Trung uý, trung uý, TRUNG ÚY, TRUNG UÝ,... là những từ khác nhau nhưng về phương diện nào đó là tương đương với nhau. Chuẩn hoá là biểu diễn tất cả các dạng tương đương này bằng 1 mã duy nhất. Do đó, với chuỗi tiếng Việt, nếu bạn vẫn cố quan tâm tới UpperCase thì... UpperCase(x) == x.
Về kích thước lưu trữ v. thời gian xử lý, alice nghĩ rằng cốt yếu trước hết ở tính đồng nhất của độ dài. Độ dài càng đồng nhất, xử lý sẽ càng dễ và càng nhanh. ASCII là một mã mà mọi chữ cái đều có cùng 1 độ dài (7 bit), khác với Morse là một loại mã mà các chữ cái có độ dài khác nhau. Morse ngắn hơn, ASCII vậy hẳn phải có gì tốt hơn Morse nên người ta mới lấy ASCII mà thay cho Morse chứ? |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
30/08/2010 20:35:19 (+0700) | #5 | 219429 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
lamer wrote:
Mã hóa xong giải mã ra khác hẳn nhau (Ngựa Gióng NGỰA GIÓNG ngựa gióng như trong ví dụ) thì làm sao mà xài được đây?
Chào bạn. Bạn nghĩ rằng Ngựa Gióng và NGỰA GIÓNG là "khác hẳn nhau". Nhưng có lẽ mục đích của việc mã hoá không phải để phục vụ cho nhu cầu hiển thị thông tin nên hai từ đó chỉ được xem là 1.
lamer wrote:
Vả lại, hình như thiếu mất phụ âm "qu" thì phải? Hay là quân được hiểu là phụ âm q và vần uân?
Phụ âm "qu" gồm 2 phụ âm "q" và "u", trong đó "q" được xem là phụ âm đầu, còn "u" thì được xem là "âm đệm" tức là có mặt trong vần. Bởi thế, Alice cũng nghĩ giống như bạn, quân = q+uân.
|
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
31/08/2010 12:56:03 (+0700) | #6 | 219462 |
lamer
Elite Member
|
0 |
|
|
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
|
|
Vậy thì sao "gi" lại là "gi" mà không phải là "g" và "i"? |
|
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
01/09/2010 15:04:59 (+0700) | #7 | 219522 |
|
lQ
Moderator
|
Joined: 29/03/2005 17:06:20
Messages: 494
Offline
|
|
"qu" không được xem là phụ âm đầu, nhưng "gi" thì được, vì 02 phụ âm đầu "g" và "gi" không đồng âm - cách đọc khác nhau, trong khi mình không thấy ai định nghĩa cách đọc "phụ âm" "qu" cả. Mọi ng thấy đúng ko nhỉ?
|
|
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
02/09/2010 10:35:23 (+0700) | #8 | 219558 |
|
xnohat
Moderator
|
Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
|
|
alice wrote:
Chào bạn. Bạn nghĩ rằng Ngựa Gióng và NGỰA GIÓNG là "khác hẳn nhau". Nhưng có lẽ mục đích của việc mã hoá không phải để phục vụ cho nhu cầu hiển thị thông tin nên hai từ đó chỉ được xem là 1.
Mình thắc mắc điểm này, nếu việc mã hoá xâu kí tự tiếng việt không phục vụ việc giải mã và tái lập hiện trạng ban đầu lúc được nhập vào của xâu kí tự để con người có thể nhận biết được dễ dàng ( Human read ) thì phương pháp mã hoá này đem lại ích lợi như thế nào khi nó làm sai lệch dữ liệu ? |
|
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
02/09/2010 20:45:50 (+0700) | #9 | 219575 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
lamer wrote:
Vậy thì sao "gi" lại là "gi" mà không phải là "g" và "i"?
Một câu hỏi rất xác đáng. Alice nghĩ rằng, với "giết" chẳng hạn, có 3 cách mã hoá:
gi+ết
g+iết
gi+iết
Hệ mã này rõ ràng là dựa trên cơ sở phát âm nên tác giả của nó chắc sẽ prefer cách thứ ba, bởi vì chỉ có cách ấy là đúng về phát âm, mặc dù giải mã phức tạp hơn hai cách kia (phải loại trừ một chữ i).
Việc giải mã phải căn cứ vào cả phụ âm đầu và vần không phải chỉ ở 1 trường hợp đơn lẻ gi+iết. Bất cứ cặp đồng âm đồng mã nào cũng phải được xử lý như thế. Ví dụ, g/gh, ng/ngh phải được giải mã tuỳ theo vần đi sau, oa/ua, oan/uan phải được giải mã tuỳ theo phụ âm đi trước. |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
02/09/2010 21:10:50 (+0700) | #10 | 219576 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
xnohat wrote:
alice wrote:
Chào bạn. Bạn nghĩ rằng Ngựa Gióng và NGỰA GIÓNG là "khác hẳn nhau". Nhưng có lẽ mục đích của việc mã hoá không phải để phục vụ cho nhu cầu hiển thị thông tin nên hai từ đó chỉ được xem là 1.
Mình thắc mắc điểm này, nếu việc mã hoá xâu kí tự tiếng việt không phục vụ việc giải mã và tái lập hiện trạng ban đầu lúc được nhập vào của xâu kí tự để con người có thể nhận biết được dễ dàng ( Human read ) thì phương pháp mã hoá này đem lại ích lợi như thế nào khi nó làm sai lệch dữ liệu ?
Alice không nghĩ nó làm sai lệch dữ liệu. Ngược lại, nó "chuẩn tắc hoá" dữ liệu, nghĩa là làm cho dữ liệu chính xác hơn, đúng với thực chất hơn.
Việc truyền tin, lưu trữ tin có thể ví như việc cô giáo đọc bài cho học sinh ghi chép. Nội dung từ vở giáo án có thể được tái hiện sang vở học sinh khá chính xác mà không cần cô giáo phải đọc các thông tin phụ giúp cho việc định dạng hiển thị (trình bày).
Nhưng nếu muốn thật chính xác, cô giáo có thể truyền thêm các thông tin phụ giúp cho việc trình bày vở: chỗ này viết hoa, chỗ kia in hoa, ở đây nét đậm, ở đó gạch chân,... Những thông tin phụ như thế mỗi cô giáo có một cách truyền và, ít nhất, môn chính tả không có mục đích là chuẩn hoá cách thức truyền đạt ấy.
|
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
02/09/2010 21:29:15 (+0700) | #11 | 219578 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
Trong bảng 3, ở dòng 2_ có 2 chỗ sai, phải sửa như thế này: uao phải thuộc cùng một mã với oao, và uau phải thuộc cùng một mã với oau.
Ví dụ 3 có chỗ sai. Theo spec ở phần 2, phải sửa lại thế này: 45 C6 31 C6 2D C6 28 C6 27 C6 giải mã thành مرحبا, tức 45 06 31 06 2D 06 28 06 27 06 theo little-endian UCS-2, tức "Unicode" trong ngôn từ của Microsoft. |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
14/09/2010 07:23:32 (+0700) | #12 | 220667 |
|
huynhfxvn
Member
|
0 |
|
|
Joined: 21/07/2005 11:09:35
Messages: 456
Location: UET.VNU
Offline
|
|
Xác xuất các chữ được viết hoa trong một văn bản là nhỏ, nên cách nén trên vẫn tỏ ra hiệu quả. Các từ được viết hoa có thể được xử lý không cần mã hoá. |
|
KHÔNG CÓ GÌ quý hơn tự do ! |
|
|
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
14/09/2010 07:25:29 (+0700) | #13 | 220668 |
|
huynhfxvn
Member
|
0 |
|
|
Joined: 21/07/2005 11:09:35
Messages: 456
Location: UET.VNU
Offline
|
|
Xác xuất các chữ được viết hoa trong một văn bản là nhỏ, nên cách nén trên vẫn tỏ ra hiệu quả. Các từ được viết hoa có thể được xử lý không cần mã hoá. Vì vậy phương pháp trên vẫn có thể sử dụng để hiện thị thông tin được. |
|
KHÔNG CÓ GÌ quý hơn tự do ! |
|
[Programming] một phương pháp mã hoá tiếng Việt (st) |
14/09/2010 08:09:27 (+0700) | #14 | 220670 |
|
louisnguyen27
Member
|
0 |
|
|
Joined: 12/08/2008 18:04:41
Messages: 321
Offline
|
|
@Alice Nếu mã hoá như thế này chữ "THÙC" có tồn tại hay không???
Trong trường hợp người dùng gõ sai "THÙ C..." thành "THÙC ..." thì phản ứng như thế nào???
Phần này mình nhớ mang máng là nằm trong luận án cao học của đồng chí nào đó. |
|
Q+SBtZW1iZXIgb2YgSFZ+B
Back to Linux soon!!! |
|
|