Trang 3 trên tổng số 3 Đầu tiênĐầu tiên 123
Từ 21 tới 28 trên tổng số 28 kết quả

Đề tài: một phương pháp mã hóa tiếng Việt

  1. #21
    Ngày gia nhập
    08 2017
    Bài viết
    2,641

    Mặc định một phương pháp mã hóa tiếng Việt

    Tiếng Việt, chữ nhiều ký tự nhất là nghiêng (7 ký tự - 7 chữ cái)

  2. #22
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Một cải tiến dễ thấy, dùng ít bộ nhớ hơn, là dựa vào tự điển các chữ Việt không dấu thanh. Theo đó, một chữ Việt mã hóa bằng số thứ tự của nó (bỏ qua dấu thanh) trong tự điển mọi chữ Việt không dấu thanh, theo sau là mã thanh.

    Tự điển như thế hiển nhiên là nhỏ hơn tự điển mọi chữ Việt đủ dấu. Nhưng đó mới chỉ là điều kiện cần để thu nhỏ mảng. Điều kiện đủ là chỉ số truy nhập mảng cũng phải ngắn gọn hơn trước. Vậy, hãy loại bỏ mã thanh ra khỏi chỉ số, giữ lại mã phụ âm đầu và mã âm vần.

    Nói hình thức hơn, gọi P, V, T lần lượt là phụ âm đầu, âm vần và thanh của một chữ Việt và p, v, t là 3 thành phần tương ứng trong mã của chữ ấy. Hiển nhiên PVT -> pvt là đơn ánh. Nhờ thế, trong cách cũ ta lấy pvt làm chỉ số để tra [số thứ tự của] PVT. Còn theo cách mới, để tra [số thứ tự của] PV, ta muốn dùng chỉ pv mà thôi.

    Muốn thế, PV -> pv phải là đơn ánh. Mã D không có tính chất này. Nhưng mã C thì có. Chẳng hạn, nhắc lại ví dụ trước đây, hai chữ bắnbắt trong mã D chỉ khác nhau ở mã thanh, nhưng trong mã C thì có mã âm vần khác nhau.

    Mặt khác, dịch mã từ D sang C rất dễ dàng, chỉ tốn vài phép tính. Thật ra, không cần dịch mã phụ âm đầu và thậm chí mã thanh, chỉ cần dịch mã âm vần. (Tức là thực hiện phép tính vD tD -> vC trong đó, chẳng hạn, vD là thành phần v của mã D.)

    Thế là ta đã lập được một mã tự điển mới, dựa trên C, gọi là C'.

    Như D', mã C' đạt mọi tiêu chí cho một mã M đã đặt ra ở bài trên:

    • Do mã C có 32 phụ âm đầu, 192 âm vần, tự điển có 32*192 = 6 * 2^10 từ mã và, do đó, số thứ tự của chúng có thể biểu diễn bằng 13 bit. Thêm 3 bit thanh, mã C' là một số nguyên 16 bit, không kể bit dấu (nếu có).
    • Do pv cũng có 13 bit, nhưng các phụ âm đầu được đánh số liên tục (từ 0 đến 31) và các âm vần cũng vậy (từ 0 đến 191), mảng không cần đến 2^13 phần tử, mà cũng chỉ cần 6 * 2^10 phần tử thôi. Và do 13 bit vẫn phải chứa bằng 2 byte, kích cỡ mảng là 12 KiB.


    Kích cỡ 12 KiB là tiến bộ so với 64 KiB trước đây, nhưng không có nhiều giá trị thực tiễn. Nó khá nhỏ so với L1 cache máy chủ, máy tính cá nhân và vài loại máy tính nhúng. Trong môi trường đó, và chỉ ở đó, cách này có thể nhanh hơn cách trước. Có thể thế.
    Đã được chỉnh sửa lần cuối bởi Ada : 04-06-2019 lúc 10:36 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #23
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Muốn giảm bộ nhớ hơn, ta phải tra bảng mã phụ âm đầu và bảng mã âm vần một cách độc lập. Nhưng P -> p và V -> v trong mã C chỉ là đơn ánh nếu xem P, V như là các âm nói. Khi chúng là chữ viết, tính đơn ánh không còn. Nhìn vào mã g/gh, không thể biết nó biểu thị chữ g hay chữ gh. Nhìn vào mã iêu/yêu, không thể biết nó biểu thị chữ iêu hay chữ yêu.

    Vì thế, ta phải dùng đến một mã khác gần với chữ viết hơn. Mã B.

    Trong mã B, ggh được biểu thị bằng hai mã số khác nhau. Và tương tự, ng/ngh, gi/g, iêu/yêu, oa/ua, đều phân biệt.

    Việc dịch mã từ C sang B tuân theo luật chính tả Việt thông thường.

    • gi/g nói chung được hiểu là gi; chỉ hiểu là g nếu mã âm vần có dạng ix hay x/x.
    • g/gh, ng/ngh nói chung được hiểu là g, ng; chỉ hiểu là gh, ngh nếu mã âm vần có dạng ex, êx, ix hay x/x.
    • Mã có dạng x/x nói chung được hiểu là x; chỉ hiểu là x nếu phụ âm đầu là âm trống.
    • Mã có dạng ox/ux nói chung được hiểu là ox; chỉ hiểu là ux nếu phụ âm đầu là q.


    Mã C có thể dịch sang mã B chỉ bằng tính toán (không tra bảng). Cách tính được xác định một cách gián tiếp qua cách dựng sau đây.

    1. Trong bảng mã âm vần C, vốn có 192 mã số, ghép hai mã số liên tiếp (chẵn, lẻ, theo thứ tự đó) thành 1 cặp. Bảng mã trở thành một bảng có 96 cặp.
    2. Xem bảng này như một ma trận 4 hàng 24 cột, chuyển vị nó thành một ma trận 24 hàng 4 cột. Ma trận chuyển vị biểu diễn một bảng mã âm vần mới có cùng cỡ với C, gọi là C*.
    3. Trong bảng mã C*, ở mỗi vị trí k có giá trị "nước đôi", nghĩa là biểu thị hai chữ u/v khác nhau, gán giá trị u cho vị trí k ấy và gán giá trị v cho vị trí k+64 (vốn nằm ngoài bảng C*).


    Sau quy trình trên, ta thu được một bảng mã âm vần lớn hơn C*. Đó chính là bảng mã âm vần của mã B.

    Còn bảng mã phụ âm đầu thì đơn giản, xin miễn trình bày.

    Bảng 3c. Bảng mã âm vần của mã B. Trong đó, ua có hai mã số khác nhau.
    Code:
         0_   1_   2_   3_   4_   5_   6_   7_    8_   9_   A_   B_   C_   D_   E_  
    ================================================================================
    _0   ai   âu   o    ơ    uê   ua   ư    ưu    a    oau  i    e         uau      
    _1   ay   uâu  ô    u    uya  uơ   ưa   ươu   oa   oay  iu   eo   ua   uay      
    _2   am   ăng  ong  ơm   uâm  uênh uơng ương  oam  oăng im   em   uam  uăng     
    _3   ap   ăc   oc   ơp   uâp  uêch uơc  ươc   oap  oăc  ip   ep   uap  uăc      
    _4   an   âm   oong ơn   uân  uôm  ưm   uyên  oan  oem  in   en   uan  uem      
    _5   at   âp   ooc  ơt   uât  uôp  ưp   uyêt  oat  oep  it   et   uat  uep      
    _6   ang  ân   ôm   ơng  uâng uôn  ưn   uyêng oang oen  inh  eng  uang uen      
    _7   ac   ât   ôp   ơc   uâc  uôt  ưt   uyêc  oac  oet  ich  ec   uac  uet      
    _8   ao   ây   oi   ơi   uêu  uôi  ưi   y     oao  oe   ia   ê    uao  ue       
    _9   au   uây  ôi   ui   uyu  uơi  ươi  uy    oai  oeo  iêu  êu   uai  ueo  yêu 
    _A   anh  âng  ôn   um   uêm  uông ưng  uym   oanh oeng iêm  êm   uanh ueng yêm 
    _B   ach  âc   ôt   up   uêp  uôc  ưc   uyp   oach oec  iêp  êp   uach uec  yêp 
    _C   ăm   om   ông  un   uên  uơm  ươm  uyn   oăm  êng  iên  ên   uăm       yên 
    _D   ăp   op   ôc   ut   uêt  uơp  ươp  uyt   oăp  êc   iêt  êt   uăp       yêt 
    _E   ăn   on   ôông ung  uêng uơn  ươn  uynh  oăn  ing  iêng ênh  uăn       yêng
    _F   ăt   ot   ôôc  uc   uêc  uơt  ươt  uych  oăt  ic   iêc  êch  uăt       yêc
    Dịch từ mã B sang mã A hết sức hữu hiệu: chỉ cần một mảng 240 phần tử, mỗi phần tử dịch 1 mã âm vần (nếu có) của mã B thành một âm vần, vốn là một xâu 5 chữ cái trên bảng mã A. Do đó, một âm vần có độ dài 5*6 = 30 bit và chiếm thực tế 4 byte bộ nhớ. Thêm ít bộ nhớ cho mảng dịch mã phụ âm đầu nữa (mỗi phụ âm đầu cũng chiếm 4 byte), cả thảy, ta chỉ tốn khoảng 1 KiB.

    Từ 12 KiB giảm xuống còn 1 KiB là một tiến bộ đáng kể. Song, như đã nói ngay từ đầu, mã A quá dài nên không phù hợp cho việc xác định thứ tự chính tả. Quy trình dịch D -> C -> B -> A chỉ là để giải mã mà thôi.

    - - - Nội dung đã được cập nhật ngày 10-06-2019 lúc 11:11 AM - - -
    Mã B trong Bảng 3c trên được dựng từ mã C ở phiên bản mới, khác phiên bản nguyên thủy từ năm 2010 (Bảng 3, bài #4). Phiên bản mới giữ nguyên cấu trúc tổng thể, chỉ thay đổi chi tiết vị trí âm vần trong bảng:

    • Trong 192 mã số, một phần tư đầu tiên dành cho các âm vần [nửa] mở, ba phần tư còn lại dành cho các âm vần [nửa] khép.
    • Mỗi cặp âm vần nửa khép và khép tương ứng, như amap, hay enet, hay inhich, hay ưngưc, chiếm hai mã số chẵn, lẻ liên tiếp.


    Do thay đổi trên, mã D (Bảng 3b, bài #17) cũng được thay đổi một cách tương ứng.

    Để đầy đủ và tiện theo dõi, xin liệt kê cả bảng mã âm vần của mã C*, mã C (mới) và mã D (mới).

    Bảng 3a. Tập hợp 192 âm vần của mã C*
    Code:
        0_   1_   2_   3_   4_   5_   6_   7_    8_   9_   A_   B_   
    =================================================================
    _0  ai   âu   o    ơ    uê   ua   ư    ưu    a    oau  i    e    
                                                      uau            
    
    _1  ay   uâu  ô    u    uya  uơ   ưa   ươu   oa   oay  iu   eo   
                                                 ua   uay            
    
    _2  am   ăng  ong  ơm   uâm  uênh uơng ương  oam  oăng im   em   
                                                 uam  uăng           
    
    _3  ap   ăc   oc   ơp   uâp  uêch uơc  ươc   oap  oăc  ip   ep   
                                                 uap  uăc            
    
    _4  an   âm   oong ơn   uân  uôm  ưm   uyên  oan  oem  in   en   
                                                 uan  uem            
    
    _5  at   âp   ooc  ơt   uât  uôp  ưp   uyêt  oat  oep  it   et   
                                                 uat  uep            
    
    _6  ang  ân   ôm   ơng  uâng uôn  ưn   uyêng oang oen  inh  eng  
                                                 uang uen            
    
    _7  ac   ât   ôp   ơc   uâc  uôt  ưt   uyêc  oac  oet  ich  ec   
                                                 uac  uet            
    
    _8  ao   ây   oi   ơi   uêu  uôi  ưi   y     oao  oe   ia   ê    
                                                 uao  ue             
    
    _9  au   uây  ôi   ui   uyu  uơi  ươi  uy    oai  oeo  iêu  êu   
                                                 uai  ueo  yêu       
    
    _A  anh  âng  ôn   um   uêm  uông ưng  uym   oanh oeng iêm  êm   
                                                 uanh ueng yêm       
    
    _B  ach  âc   ôt   up   uêp  uôc  ưc   uyp   oach oec  iêp  êp   
                                                 uach uec  yêp       
    
    _C  ăm   om   ông  un   uên  uơm  ươm  uyn   oăm  êng  iên  ên   
                                                 uăm       yên       
    
    _D  ăp   op   ôc   ut   uêt  uơp  ươp  uyt   oăp  êc   iêt  êt   
                                                 uăp       yêt       
    
    _E  ăn   on   ôông ung  uêng uơn  ươn  uynh  oăn  ing  iêng ênh  
                                                 uăn       yêng      
    
    _F  ăt   ot   ôôc  uc   uêc  uơt  ươt  uych  oăt  ic   iêc  êch  
                                                 uăt       yêc

    Bảng 3 (phiên bản 2019). Tập hợp 192 âm vần của mã C.
    Code:
        _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C    _D   _E   _F  
    ====================================================================================
    0_  ai   ay   ao   au   âu   uâu  ây   uây  o    ô    oi   ôi   ơ     u    ơi   ui  
    
    
    1_  uê   uya  uêu  uyu  ua   uơ   uôi  uơi  ư    ưa   ưi   ươi  ưu    ươu  y    uy  
    
    
    2_  a    oa   oao  oai  oau  oay  oe   oeo  i    iu   ia   iêu  e     eo   ê    êu  
             ua   uao  uai  uau  uay  ue   ueo                 yêu                      
    
    3_  am   ap   anh  ach  ăng  ăc   âng  âc   ong  oc   ôn   ôt   ơm    ơp   um   up  
    
    
    4_  uâm  uâp  uêm  uêp  uênh uêch uông uôc  uơng uơc  ưng  ưc   ương  ươc  uym  uyp 
    
    
    5_  oam  oap  oanh oach oăng oăc  oeng oec  im   ip   iêm  iêp  em    ep   êm   êp  
        uam  uap  uanh uach uăng uăc  ueng uec            yêm  yêp                      
    
    6_  an   at   ăm   ăp   âm   âp   om   op   oong ooc  ông  ôc   ơn    ơt   un   ut  
    
    
    7_  uân  uât  uên  uêt  uôm  uôp  uơm  uơp  ưm   ưp   ươm  ươp  uyên  uyêt uyn  uyt 
    
    
    8_  oan  oat  oăm  oăp  oem  oep  êng  êc   in   it   iên  iêt  en    et   ên   êt  
        uan  uat  uăm  uăp  uem  uep                      yên  yêt                      
    
    9_  ang  ac   ăn   ăt   ân   ât   on   ot   ôm   ôp   ôông ôôc  ơng   ơc   ung  uc  
    
    
    A_  uâng uâc  uêng uêc  uôn  uôt  uơn  uơt  ưn   ưt   ươn  ươt  uyêng uyêc uynh uych
    
    
    B_  oang oac  oăn  oăt  oen  oet  ing  ic   inh  ich  iêng iêc  eng   ec   ênh  êch 
        uang uac  uăn  uăt  uen  uet                      yêng yêc

    Bảng 3b (phiên bản 2019). Tập hợp 120 âm vần của mã D. Cũng như phiên bản trước đây, nếu mã số biểu thị 4 giá trị (như iêm/yêm/iêp/yêp, hay oanh/uanh/oach/uach), thì chỉ liệt kê 2 giá trị tiêu biểu (iêm/iêp, oanh/oach).
    Code:
        _0   _1   _2   _3   _4   _5   _6    _7   _8   _9   _A   _B   _C    _D   _E   _F  
    =====================================================================================
    0_  ai   ay   ao   au   âu   uâu  ây    uây  o    ô    oi   ôi   ơ     u    ơi   ui  
    
    
    1_  uê   uya  uêu  uyu  ua   uơ   uôi   uơi  ư    ưa   ưi   ươi  ưu    ươu  y    uy  
    
    
    2_  a    oa   oao  oai  oau  oay  oe    oeo  i    iu   ia   iêu  e     eo   ê    êu  
             ua   uao  uai  uau  uay  ue    ueo                 yêu                      
    
    3_                                           am   anh  ăng  âng  ong   ôn   ơm   um  
                                                 ap   ach  ăc   âc   oc    ôt   ơp   up  
    
    4_  uâm  uêm  uênh uông uơng ưng  ương  uym  oam  oanh oăng oeng im    iêm  em   êm  
        uâp  uêp  uêch uôc  uơc  ưc   ươc   uyp  oap  oach oăc  oec  ip    iêp  ep   êp  
    
    5_  an   ăm   âm   om   oong ông  ơn    un   uân  uên  uôm  uơm  ưm    ươm  uyên uyn 
        at   ăp   âp   op   ooc  ôc   ơt    ut   uât  uêt  uôp  uơp  ưp    ươp  uyêt uyt 
    
    6_  oan  oăm  oem  êng  in   iên  en    ên   ang  ăn   ân   on   ôm    ôông ơng  ung 
        oat  oăp  oep  êc   it   iêt  et    êt   ac   ăt   ât   ot   ôp    ôôc  ơc   uc  
    
    7_  uâng uêng uôn  uơn  ưn   ươn  uyêng uynh oang oăn  oen  ing  inh   iêng eng  ênh 
        uâc  uêc  uôt  uơt  ưt   ươt  uyêc  uych oac  oăt  oet  ic   ich   iêc  ec   êch
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm qua lúc 11:12 AM. Lý do: Cập nhật bảng mã
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #24
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Bảng mã phụ âm đầu từ năm 2010 đến nay chỉ có gi, không có gi/g. Vậy, giờ sao phải phức tạp hóa với "mã gi/g"? Có gì bất ổn nếu chỉ có một mã gi, luôn biểu thị chữ gi?

    Không có. Mà như vậy có lẽ còn tốt nữa là khác. Như ta sẽ thấy về sau, sẽ tiện lợi hơn khi mã gi/g này luôn giải thành g-i một cách nhất quán bất kể khi giải mã hay khi so sánh, bất chấp chữ cái tiếp theo là i hay không, và nếu thế, thì chính chữ i thứ hai này mới là chữ cái cần phải xóa đi trong quá trình xử lý.

    gi/g được giới thiệu vì lý do sư phạm. Để giải quyết một vấn đề, nên khởi nguồn từ bản chất. Phải đúng bản chất thì mới trực quan, dễ hiểu, dễ nhớ. Bản chất là gi/g (bởi vì trong giêng, giết chủ âm là chứ không phải là ê.) Còn việc rút gọn gi/g thành gi là chi tiết thực thi, sẽ làm sau.

    Giới thiệu lại mã gi như gi/g cũng nhằm giới thiệu một hiện tượng tinh tế hơn nhưng cùng bản chất ở một mã phụ âm đầu khác. Đó là y.

    y không những dùng để mã hóa các chữ hiếm như yang, yeo, yoc, yung,... Nó còn dùng để mã hóa những chữ rất thông thường như yêu, yêm, yên. Bởi vì như mã gi, nó có thể hiểu theo 2 nghĩa. Hiểu như y. Hoặc hiểu như âm trống. Hiểu như y khi đi sau nó là ang, eo, oc, ung hay bất cứ âm vần nào trừ yêu, yêm,... gọi chung là x/x, khi nó được hiểu như âm trống. Và do thế, cũng như mã gi gọi tên đúng là mã gi/g, mã y nếu gọi tên đúng phải là y/--.

    Vậy, trong cách mã hóa này, mã x/x không bao giờ theo sau âm trống, mà luôn theo sau một mã phụ âm đầu thực sự nào đó, có thể là gi/g hoặc cùng lắm là y/--. Nói trắng ra, cũng như chữ giết được mã hóa là gi-iết, chữ yêu phải được mã hóa là y-yêu ngay từ ban đầu. Và cũng như gi-iết biến thành g-iết hay gi-ết trước khi trở về chữ giết, mã y-yêu biến thành --yêu hay y-êu trước khi trở về chữ yêu trong quá trình giải mã hay xác định thứ tự chính tả.

    Tóm lại, câu thứ ba trong thuật toán dịch sang mã B trên, viết lại cho đúng, là

    • Mã phụ âm đầu y/-- nói chung được hiểu là y; chỉ hiểu là -- nếu mã âm vần có dạng x/yêx.
    • Mã âm vần dạng x/x nói chung được hiểu là x; chỉ hiểu là x nếu mã phụ âm đầu là y/--.


    Mã hóa như thế có nhất thiết bắt buộc?

    Không cần. Nhưng nếu không làm thế, hiệu quả thấp. Khi có dịp mình sẽ quay trở lại vấn đề này.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 07:29 PM - - -

    Mã B là một mã hữu hiệu và hoàn toàn hữu dụng, ít ra cho việc giải mã (để hiển thị). Nhưng giới thiệu nó để mô tả đúng bản chất sự vật, để vào đề. Và khi nói thế, mình đã ngụ ý rằng cho việc khác, như xác định thứ tự chính tả mà không giải mã, ta phải đi xa hơn. Ta sẽ dùng đến mã khác, dù không đúng bản chất, nhưng hữu hiệu hơn và hữu dụng hơn.

    Đó là mã B+.

    Mã B+ là một dị bản của mã B, với mã gi/g biểu thị nhất quán chữ gi và mã y/-- biểu thị nhất quán chữ y. Vì thế, có thể gọi tên chúng đơn giản là mã gi, mã y.

    Dị biệt cơ bản trên sinh ra hai dị biệt nữa khi dịch mã C (và C*) sang mã B+
    • Khi theo sau mã phụ âm đầu y, mọi mã âm vần có dạng x/x được hiểu là êx.
    • Khi theo sau mã phụ âm đầu gi, mọi mã âm vần có dạng ix, kể cả i, và x/x, lần lượt được hiểu là x, êx. Nói riêng, i được hiểu là --.

    Nói một cách nôm na, chữ y thứ hai, chữ i thứ hai là chữ cái thừa và, do đó, đã bị xóa.

    Sau đây là vài ví dụ về dịch sang mã B+.

    -- Mã y-yêu hiểu là y-êu.

    -- Mã gi-iêm hiểu là gi-êm.

    -- Mã gi-in hiểu là gi-n.

    -- Mã gi-i hiểu là gi--.

    Hai dị biệt về dịch thuật nói trên cảm sinh ra 2 dị biệt nữa trong bản thân mã. Khác với mã B, mã B+

    • không còn 7 mã có dạng x, và
    • có thêm 9 mã âm vần, dành cho 8 phụ âm cuối và âm trống.

    Bảng 3d. Bảng mã âm vần của mã B+. Như B, trong B+ một âm vần có thể có vài mã số khác nhau. Chẳng hạn, B+(êc) = {0x9D, 0xEF}.
    Code:
         0_   1_   2_   3_   4_   5_   6_   7_    8_   9_   A_   B_   C_   D_   E_  
    ================================================================================
    _0   ai   âu   o    ơ    uê   ua   ư    ưu    a    oau  i    e         uau  --  
    _1   ay   uâu  ô    u    uya  uơ   ưa   ươu   oa   oay  iu   eo   ua   uay  u?  
    _2   am   ăng  ong  ơm   uâm  uênh uơng ương  oam  oăng im   em   uam  uăng m   
    _3   ap   ăc   oc   ơp   uâp  uêch uơc  ươc   oap  oăc  ip   ep   uap  uăc  p   
    _4   an   âm   oong ơn   uân  uôm  ưm   uyên  oan  oem  in   en   uan  uem  n   
    _5   at   âp   ooc  ơt   uât  uôp  ưp   uyêt  oat  oep  it   et   uat  uep  t   
    _6   ang  ân   ôm   ơng  uâng uôn  ưn   uyêng oang oen  inh  eng  uang uen  nh  
    _7   ac   ât   ôp   ơc   uâc  uôt  ưt   uyêc  oac  oet  ich  ec   uac  uet  ch  
    _8   ao   ây   oi   ơi   uêu  uôi  ưi   y     oao  oe   ia   ê    uao  ue   a?  
    _9   au   uây  ôi   ui   uyu  uơi  ươi  uy    oai  oeo  iêu  êu   uai  ueo  êu  
    _A   anh  âng  ôn   um   uêm  uông ưng  uym   oanh oeng iêm  êm   uanh ueng êm  
    _B   ach  âc   ôt   up   uêp  uôc  ưc   uyp   oach oec  iêp  êp   uach uec  êp  
    _C   ăm   om   ông  un   uên  uơm  ươm  uyn   oăm  êng  iên  ên   uăm       ên  
    _D   ăp   op   ôc   ut   uêt  uơp  ươp  uyt   oăp  êc   iêt  êt   uăp       êt  
    _E   ăn   on   ôông ung  uêng uơn  ươn  uynh  oăn  ing  iêng ênh  uăn  ng   êng 
    _F   ăt   ot   ôôc  uc   uêc  uơt  ươt  uych  oăt  ic   iêc  êch  uăt  c    êc
    Giống như mã B, mã B+ hữu dụng trong việc giải mã để hiển thị. Nhưng hơn thế nữa, như đã giới thiệu, ta sẽ dùng nó để xác định thứ tự chính tả.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 10:28 PM - - -

    Ta đã biết rằng thứ tự chính tả (hay nói đúng hơn, mã tự điển) của một chữ có thể xác định bằng cách phân tách nó ra từng chữ cái. Đó là giải mã toàn phần, hay nói cách khác là "mã hóa" nó bằng mã A.

    Và với mã D', C', các đại biểu của kỹ thuật so sánh mà hoàn toàn không giải mã, ta cũng đã biết rằng có thể xác định mà chẳng cần phải phân tách gì cả (hoặc chỉ tách mã thanh, trong trường hợp của mã C'). Hai mã chữ hoàn toàn có thể so sánh được với nhau như là hai chữ, theo đúng thứ tự chính tả, kể cả khi hai chữ dài ngắn khác nhau, miễn là theo sau chúng không có thêm chữ cái nào.

    Kết hợp hai kỹ thuật trên, ngay lập tức ta có cách so sánh không giải mã, nói thật hơn, chỉ giải mã một phần: mã hóa một chữ bằng một xâu ký tự, với mỗi ký tự biểu diễn một chữ cái, riêng ký tự cuối có thể biểu diễn một xâu [nhiều] chữ cái. Nhờ thế, có thể giảm số ký tự trong mã chữ và, hy vọng, cả độ dài (tính bằng bit) của mã chữ.

    Ví dụ, bảng mã A có 34 ký tự, trong đó 33 ký tự thể hiện chữ cái Việt và 1 ký tự thể hiện dấu trắng. Thêm 3 ký tự lần lượt thể hiện chữ ch, nh, ng nữa, mà hiển nhiên chỉ chuyên dùng để mã hóa phụ âm cuối, ta được mã A1 với 37 ký tự. Giống mã A, độ dài ký tự vẫn chỉ là 6 bit. Nhưng khác mã A, độ dài mã âm vần đã giảm từ 5 còn 4 ký tự, mã chữ giảm từ 7 còn 6 ký tự.

    Phụ âm đầu có tối đa 3 ký tự, nhưng ta sẽ giảm 1 ký tự bằng cách loại bỏ chữ ngh: thay thế mọi ngh bằng ng, ta được một "tiếng Việt mới" đẳng cấu (tương đương) với tiếng Việt về mọi mặt, kể cả thứ tự chính tả. Thật vậy: (1) Với một âm vần v bất kỳ, nghv và ngv không đồng thời tồn tại trong tiếng Việt, nên phép thay thế này biến chữ Việt nghv thành một chữ mới toanh, không "đụng hàng" với bất cứ chữ Việt nào sẵn có, nói cách khác, phép thay thế là song ánh từ tiếng Việt đến "tiếng Việt mới"; (2) Nếu cả hai chữ Việt cần so sánh đều không thay đổi qua phép thay thế này, dĩ nhiên tương quan của chúng không đổi; (3) Nếu chỉ một chữ Việt x chịu tác động của sự thay thế còn chữ Việt thứ hai w thì không, nói cách khác x nằm trong khoảng từ nghe đến nghiu, tương quan giữa hai chữ cũng không đổi bởi vì thay thế ngh bằng ng chỉ nới rộng khoảng "tung hoành" cho x từ nge đến ngiu, trong khi chữ w vẫn "ung dung" yên vị ở ngoài khoảng này; và cuối cùng (4) Nếu cả hai chữ Việt cần so sánh đều bị thay đổi do sự thay thế, tương quan của chúng vẫn không đổi bởi vì với hai xâu (do đó, nói riêng, hai âm vần) u, v bất kỳ và với hai xâu p, q bất kỳ (do đó, nói riêng, hai phụ âm đầu ng, ngh) pu < pv khi và chỉ khi qu < qv.

    Dùng đến cả "quái chiêu" này, mã A1 vẫn còn đến 5 ký tự, với độ dài 5*6 + 3 = 33 bit. Nghĩa là vẫn còn quá dài cho một mã tự điển M hữu dụng.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 11:38 PM - - -

    Nhưng kỹ thuật trên hoàn toàn có thể cải tiến thêm. Với bảng ký tự sau đây, có thể lập được một mã mới trên cùng nguyên lý với A1, gọi là A2.

    Dễ thấy, bởi thế xin nói luôn, rằng bảng này có 2^2*3^3 = 108 ký tự và vì thế, một ký tự có thể mã hóa bằng 7 bit; mọi âm vần (Bảng 3c) đều có thể viết bằng 2 ký tự và mọi phụ âm đầu ngoại trừ ngh (vốn đã bị loại) cũng thế; vậy, một mã chữ trong mã A2 này chỉ còn có 4 ký tự, với độ dài 4*7 + 3 = 31 bit; hiển nhiên, mã B có thể dịch sang mã A2 bằng tự điển gồm bảng (mảng) phụ âm đầu và bảng (mảng) âm vần, với kích cỡ rất nhỏ là 34*2 + 240*2 = 548 byte; tóm lại, mã A2 đạt mọi tiêu chuẩn hữu dụng và hữu hiệu cần cho mã tự điển M.

    Bảng 6. Tập hợp 108 ký tự của mã A2.
    Code:
    --   au   âp   en   êp   m    ông  p    ych  
    a    ay   ât   eng  êt   n    ôp   q    yêc  
    ac   ăc   âu   eo   êu   ng   ôt   r    yên  
    ach  ăm   ây   ep   f    nh   ơ    s    yêng 
    ai   ăn   b    et   g    o    ơc   t    yêt  
    am   ăng  c    ê    h    oc   ơi   u    ym   
    an   ăp   ch   êc   i    ong  ơm   ư    yn   
    ang  ăt   d    êch  ia   ô    ơn   v    ynh  
    anh  âc   đ    êm   iu   ôc   ơng  w    yp   
    ao   âm   e    ên   j    ôi   ơp   x    yt   
    ap   ân   ec   êng  k    ôm   ơt   y    yu   
    at   âng  em   ênh  l    ôn   ơu   ya   z
    Điều khó thấy là lập tự điển như thế nào. Một âm vần có thể viết thành xâu tối đa 2 ký tự chọn từ bảng này (trong đó, chỉ ký tự cuối có thể hàm ý nhiều chữ cái) theo một hay nhiều cách viết khác nhau. Chẳng hạn, oong chỉ có đúng 1 cách viết là o-onguyêng chỉ có đúng 1 cách viết là u-yêng, nhưng ong có thể viết bằng o-ng hoặc ongyêng có thể viết bằng y-êng hoặc yêng. Cách nào là đúng?

    Giải đáp câu hỏi này không khó. Nhưng nếu có cách nào làm mà không cần hỏi/đáp gì cả thì vẫn hay hơn.

    - - - Nội dung đã được cập nhật ngày 12-06-2019 lúc 05:05 PM - - -

    Và kết quả cuối cùng, cách "làm mà không cần hỏi/đáp gì". Chỉ giải mã phụ âm đầu, giữ nguyên mã âm vần. Mã này, tất nhiên, được gọi là mã A3. Và mã tự điển thu được bằng cách hoán vị bảng ký tự của A3 để lấy luôn số thứ tự chính tả làm mã số, như thường lệ, được gọi là A3'.

    Nói rõ hơn, bảng mã A3 là bảng mã âm vần của mã B+, vốn đã chứa sẵn 5 chữ cái có mặt trong các phụ âm cuối, bổ sung 16 chữ cái vốn chỉ có mặt trong các phụ âm đầu. Chú ý rằng 16 chữ cái thêm này được gán mã ký tự một cách hoàn toàn tùy ý: chúng không được dùng ở bất cứ đâu khi giải mã lẫn khi xác định thứ tự chính tả, bởi vì giải mã thật ra là dịch từ mã D, C, C*, B hoặc B+ ra mã A, còn xác định thứ tự chính tả là dịch thẳng ra mã A3', hơn là A3. Liệt kê chúng ra (xem Bảng 3e) chẳng qua để chứng tỏ rằng mã A3 có không quá 256 ký tự và mã A3', do đó, cũng thế. Thực ra, chúng chỉ có 3^5 = 243 ký tự phân biệt mà thôi (xem Bảng 7). Vậy, A3 và A3' là các mã ký tự 8 bit.

    Một chữ Việt được mã hóa bằng 3 ký tự (gồm 2 ký tự phụ âm đầu và 1 ký tự cho âm vần). Độ dài mã là 3*8 + 3 = 27 bit.

    Mảng phụ âm đầu và mảng âm vần dùng hết 33*2 + 240*1 = 306 byte.

    Bảng 3e. Bảng mã A3.

    Code:
         0_   1_   2_   3_   4_   5_   6_   7_    8_   9_   A_   B_   C_   D_   E_   F_
    ===================================================================================
    _0   ai   âu   o    ơ    uê   ua   ư    ưu    a    oau  i    e         uau  --   b 
    _1   ay   uâu  ô    u    uya  uơ   ưa   ươu   oa   oay  iu   eo   ua   uay  u?   d 
    _2   am   ăng  ong  ơm   uâm  uênh uơng ương  oam  oăng im   em   uam  uăng m    đ 
    _3   ap   ăc   oc   ơp   uâp  uêch uơc  ươc   oap  oăc  ip   ep   uap  uăc  p    f 
    _4   an   âm   oong ơn   uân  uôm  ưm   uyên  oan  oem  in   en   uan  uem  n    g 
    _5   at   âp   ooc  ơt   uât  uôp  ưp   uyêt  oat  oep  it   et   uat  uep  t    h 
    _6   ang  ân   ôm   ơng  uâng uôn  ưn   uyêng oang oen  inh  eng  uang uen  nh   j 
    _7   ac   ât   ôp   ơc   uâc  uôt  ưt   uyêc  oac  oet  ich  ec   uac  uet  ch   k 
    _8   ao   ây   oi   ơi   uêu  uôi  ưi   y     oao  oe   ia   ê    uao  ue   a?   l 
    _9   au   uây  ôi   ui   uyu  uơi  ươi  uy    oai  oeo  iêu  êu   uai  ueo  êu   q 
    _A   anh  âng  ôn   um   uêm  uông ưng  uym   oanh oeng iêm  êm   uanh ueng êm   r 
    _B   ach  âc   ôt   up   uêp  uôc  ưc   uyp   oach oec  iêp  êp   uach uec  êp   s 
    _C   ăm   om   ông  un   uên  uơm  ươm  uyn   oăm  êng  iên  ên   uăm       ên   v 
    _D   ăp   op   ôc   ut   uêt  uơp  ươp  uyt   oăp  êc   iêt  êt   uăp       êt   w 
    _E   ăn   on   ôông ung  uêng uơn  ươn  uynh  oăn  ing  iêng ênh  uăn  ng   êng  x 
    _F   ăt   ot   ôôc  uc   uêc  uơt  ươt  uych  oăt  ic   iêc  êch  uăt  c    êc   z

    Bảng 7. Tập hợp 243 ký tự của mã A3, A3'.
    Code:
    --   ây   i    oac  oi   q    uâng ung   uynh
    a    b    ia   oach om   r    uâp  uôc   uyp 
    ac   c    ic   oai  on   s    uât  uôi   uyt 
    ach  ch   ich  oam  ong  t    uâu  uôm   uyu 
    ai   d    iêc  oan  ooc  u    uây  uôn   ư   
    am   đ    iêm  oang oong ua   uc   uông  ưa  
    an   e    iên  oanh op   uac  ue   uôp   ưc  
    ang  ec   iêng oao  ot   uach uec  uôt   ưi  
    anh  em   iêp  oap  ô    uai  uem  uơ    ưm  
    ao   en   iêt  oat  ôc   uam  uen  uơc   ưn  
    ap   eng  iêu  oau  ôi   uan  ueng uơi   ưng 
    at   eo   im   oay  ôm   uang ueo  uơm   ươc 
    au   ep   in   oăc  ôn   uanh uep  uơn   ươi 
    ay   et   ing  oăm  ông  uao  uet  uơng  ươm 
    ăc   ê    inh  oăn  ôôc  uap  uê   uơp   ươn 
    ăm   êc   ip   oăng ôông uat  uêc  uơt   ương
    ăn   êch  it   oăp  ôp   uau  uêch up    ươp 
    ăng  êm   iu   oăt  ôt   uay  uêm  ut    ươt 
    ăp   ên   j    oc   ơ    uăc  uên  uy    ươu 
    ăt   êng  k    oe   ơc   uăm  uêng uya   ưp  
    âc   ênh  l    oec  ơi   uăn  uênh uych  ưt   
    âm   êp   m    oem  ơm   uăng uêp  uyêc  ưu   
    ân   êt   n    oen  ơn   uăp  uêt  uyên  v    
    âng  êu   ng   oeng ơng  uăt  uêu  uyêng w    
    âp   f    nh   oeo  ơp   uâc  ui   uyêt  x    
    ât   g    o    oep  ơt   uâm  um   uym   y    
    âu   h    oa   oet  p    uân  un   uyn   z
    Tóm lại, như A2, mã A3' đạt mọi tiêu chuẩn cần thiết cho một mã tự điển M hữu dụng và hữu hiệu. Khác A2, tự điển dịch sang mã A3' chính là bảng âm vần (của mã B+) có sẵn rồi. Ta cứ dùng nó thôi, chẳng cần phải băn khoăn gì nữa.

    - - - Nội dung đã được cập nhật ngày 13-06-2019 lúc 12:25 AM - - -

    Có điều, ít ra cũng nên thắc mắc một chút. Vì sao để lập mã tự điển A3', mã B vô dụng còn mã B+ thì hữu dụng?

    Để trả lời câu hỏi thứ nhất, chỉ cần nêu một ví dụ. So sánh giếng với giường. Hình 8 chỉ rõ layout (định dạng) của hai chữ này trong mã A3 (và A3') giả định dựa trên mã B và, nhân tiện, chỉ rõ luôn layout trong mã A3, A3' "thật", vốn được định nghĩa trên mã B+.

    Trong mã A3, A3' giả định, hai mã chữ là g-i-ươngg-iêng, và do i < iêng, ta sẽ thu được kết quả giường < giếng (sai).

    Còn trong mã A3, A3' "thật" hai mã chữ là g-i-ươngg-i-êng, và do trong A3' êng < ương, mã A3' "thật" cho kết quả giếng < giường (đúng) trong ví dụ đơn lẻ này.

    Hình 8. Định dạng của hai chữ Việt trong mã A3 (và A3') vốn dựa trên mã B+ và biến thể giả định của nó dựa trên mã B. a) Chữ giường trong cả hai mã được mã hóa như nhau. b) Chữ giếng trong biến thể. c) Chữ giếng trong mã A3 (và A3').

    Code:
    a) "giường" trong A3[B/B+]
    +-----+-----+-----+-----+
    |g    |i    |ương |huyền|
    +-----+-----+-----+-----+
    
    b) "giếng" trong A3[B]
    +-----+-----+-----+-----+
    |g    |iêng |-    |sắc  |
    +-----+-----+-----+-----+
    
    c) "giếng" trong A3[B+]
    +-----+-----+-----+-----+
    |g    |i    |êng  |sắc  |
    +-----+-----+-----+-----+
    Vậy, nếu dựa trên mã B, mã A3 có thể đặt 2 mã chữ vào tư thế so sánh khập khiễng. Hậu quả, mã A3' tương ứng không đảm bảo rằng A3'(x) < A3'(y) khi và chỉ khi x < y cho 2 chữ Việt x, y bất kỳ. Nói cách khác, nó không phải là một mã tự điển.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm qua lúc 11:17 AM. Lý do: Cập nhật bảng mã B+, A3
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #25
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Để trả lời câu hỏi thứ hai, trước hết ta xác định trong điều kiện nào, kỹ thuật giải mã tiền tố (vốn tạo ra các mã kiểu như A3' từ các mã kiểu như B+) có thể cho một mã tự điển.

    Mã A không kể dấu thanh là một mã chữ cái (1), nghĩa là mỗi ký tự của từ mã biểu thị một chữ cái của ngôn ngữ nguồn (vốn là tập hợp các chữ Việt không dấu thanh, trong ngữ cảnh loạt bài này). Các mã A1, A2, A3, A3' cũng tương tự, chỉ khác là ký tự cuối biểu thị một xâu [gồm 0, 1 hoặc nhiều] chữ cái của ngôn ngữ nguồn. Các mã như thế là mã nén hậu tố. (Gọi thế gọn hơn, nhưng trong loạt bài này, mã giải nén tiền tố có lẽ dễ hiểu hơn.)

    Nhưng "ký tự cuối" là gì? Trong mã A, A1, A2, A3, A3' mọi từ mã không kể mã thanh đều dài như nhau, đúng n ký tự. Ở mã A, chẳng hạn, n = 7. "Ký tự cuối" phải chăng là ký tự thứ 7?

    Có 3 loại ký tự: dấu trắng, đơn tự (biểu thị một chữ cái) và hợp tự (biểu thị một chữ ghép từ nhiều chữ cái). Dấu trắng là ký tự vô nghĩa. Nó được viết thêm vào cuối, lặp đi lặp lại, để từ mã đủ n ký tự mà thôi. Nó chỉ là một chi tiết thực thi. Có thể làm như thế bởi vì về mặt tự điển, chữ được hiểu như xâu chữ cái (có nghĩa) với độ dài không quá n nhưng cũng có thể hiểu là xâu có độ dài đúng n, cho phép vài dấu trắng (vô nghĩa) ở cuối, miễn là để so sánh, dấu trắng đứng đầu bảng chữ cái.

    Do vậy, ở đây, ta sẽ xem xét mã nén hậu tố trong bản chất của nó, là xâu ký tự có nghĩa với độ dài không quá n, và chỉ có 2 loại ký tự là đơn tự và hợp tự. Trong cách nhìn đó, "ký tự cuối" là ký tự có nghĩa cuối, không nhất thiết ký tự thứ n.

    Trong một mã nén hậu tố, ký tự cuối có thể là hợp tự, ký tự ở các vị trí còn lại đều là đơn tự.

    Dễ thấy rằng, muốn một mã nén hậu tố là một mã tự điển, trước hết bảng ký tự (2) của nó phải là một mã tự điển. Nhưng đó mới chỉ là điều kiện cần. [Phản] ví dụ ở bài trên là minh chứng.

    Hãy xem hai chữ Việt saotbu mã hóa trong một mã nén hậu tố M nào đó, với ab hai chữ cái, s, t, o, u là các xâu chữ cái, trong đó st có cùng độ dài và đã được mã hoá tách biệt khỏi ao, bu bằng hai xâu [đơn tự, cùng độ dài].

    Do hai tiền tố s, t cùng độ dài (có thể cùng là xâu trống), hai chữ cái a, b ở cùng vị trí (có thể cùng dẫn đầu chữ) để xem xét so sánh với nhau.

    Khi st, không có vấn đề so sánh a với b.

    Khi s = t (kể cả khi cả hai cùng trống), có 5 trường hợp.

    • a, b được mã hóa bằng đơn tự.
    • ao, bu được mã hóa bằng hợp tự.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự, u trống.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự (tách biệt với u), u không trống, ab.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự (tách biệt với u), u không trống, a = b.


    Nếu bảng ký tự của M là một mã tự điển, dễ thấy rằng 4 trường hợp đầu được giải quyết.

    Chỉ còn trường hợp cuối, thực chất là so sánh tao với tau. Nếu bảng ký tự của M là một mã tự điển thì do a < ao, M(a) < M(ao), nên M(tau) < M(tao), tau < tao, vốn chỉ đúng nếu u < o, sai nếu o < u. Chả cần phải nói rằng kết quả sai trong trường hợp này đã được minh hoạ qua ví dụ bằng số, ở bài trên.

    Nhìn lại, trường hợp "may rủi" này xảy ra là do đối với hai chữ có dạng tao, tau, hai hậu tố ao, au, vốn có chung chữ cái đầu, đã được mã hóa bằng hai cách khác nhau, nghĩa là mã hóa một cách bất nhất.

    Vậy, có thể dựng mã tự điển bằng cách khử tính bất nhất ấy.

    ____________________
    NOTES

    (1) Thuật ngữ tiêu chuẩn là mã ký tự (character code). Trong bài này, chỉ ký tự của ngôn ngữ mã mới được gọi là "ký tự", còn ký tự của ngôn ngữ nguồn được gọi là "chữ cái". Nhất quán với đó, "mã ký tự" phải gọi trệch thành "mã chữ cái".

    (2) Thuật ngữ tiêu chuẩn là bảng chữ cái (alphabet). Gọi trệch thành "bảng ký tự" để nhất quán với quy ước trên.

    - - - Nội dung đã được cập nhật ngày 15-06-2019 lúc 10:09 AM - - -

    Với phân tích trên, cách dựng, hiển nhiên, như sau. Phân hoạch tập chữ thành các lớp, mỗi lớp gồm mọi chữ trùng nhau ở chữ cái đầu. Ở từng lớp, chọn một trong 2 cách mã hoá chữ: cả chữ thành một ký tự hoặc riêng chữ cái đầu thành một ký tự (và đoạn hậu tố còn lại, đến lượt mình, lại được xem như là "chữ" để xét tiếp). Cách mã hoá, một khi đã chọn, được áp dụng nhất quán lên mọi chữ trong lớp. Một cách hình thức:

    • Một mã nén hậu tố được gọi là một mã chính quy nếu từng lớp chữ chung nhau chữ cái đầu đều được mã hóa nhất quán.
    • Theo sau một tiền tố t nhất định đã được mã hóa tách biệt [bằng một xâu đơn tự], một lớp các hậu tố chung chữ cái đầu a được mã hóa nhất quán nếu (a) mỗi phần tử đều được mã hóa bằng một ký tự, hoặc (b) chữ cái đầu a ở mọi phần tử được mã hóa tách biệt [bằng một đơn tự] và theo sau tiền tố ta, từng lớp các hậu tố có chung chữ cái đầu đều được mã hóa nhất quán.


    Trong đó, một chữ cũng được xem là một hậu tố (theo sau tiền tố trống). Chú ý rằng lớp hậu tố là phân biệt theo từng tiền tố. Hai lớp hậu tố dẫu bằng nhau nhưng theo sau hai tiền tố khác nhau vẫn là hai lớp "khác nhau" và như thế, có thể mã hoá nhất quán theo hai cách khác nhau. Lớp hậu tố no = {n, ng, nh} trong tiếng Việt, chẳng hạn, có thể được mã hóa nhất quán bằng n, n-g, n-h sau tiền tố ta, to, nhưng cũng nhất quán bằng n, ng, nh sau tiền tố tha, tro và, nếu thế, lớp mọi chữ tx chung chữ cái đầu t rất có thể cũng được mã hoá nhất quán.

    Có thể xem các mã chữ cái là trường hợp riêng, tầm thường, của mã nén hậu tố. (Tầm thường vì chúng không "nén" gì cả, hay nói theo ngữ cảnh của bài này, chúng giải nén toàn phần.) Theo nghĩa này, mọi mã chữ cái đều chính quy. Mã A, chẳng hạn, là một mã chính quy.

    Với cách dựng đó, có thể khẳng định.

    • Một mã chính quy là một mã tự điển nếu và chỉ nếu bảng ký tự của nó là một mã tự điển.


    Bây giờ, ta kiểm tra mã A3, vốn hiển nhiên là một mã nén hậu tố, xem nó có chính quy hay không. Hễ nó chính quy thì mã A3', vốn chính là A3 chỉ sai khác hoán vị bảng ký tự, đương nhiên cũng sẽ chính quy và hơn thế nữa, do bảng ký tự đã được sắp xếp theo thứ tự chính tả, sẽ là mã tự điển.

    Kiểm tra mã A3 dễ hơn mã A2. Các âm vần đều bắt đầu bằng một chữ cái nguyên âm. Ngược lại, hầu hết các phụ âm đầu đều chỉ gồm toàn chữ cái phụ âm. Nhờ thế, cho mỗi lớp các hậu tố chung chữ cái đầu, cách mã hoá về cơ bản đã được chọn một cách tự nhiên: nếu lớp ấy là một "lớp phụ âm", biết là đang "bóc, tách" nó ở phụ âm đầu, thì chọn cách (b) (đơn tự) và tiếp tục "bóc, tách" các hậu tố; còn nếu lớp ấy là một "lớp nguyên âm", biết là đã "chạm" đến âm vần, thì thôi "bóc, tách" mà "nhai, nuốt" nó luôn bằng cách (a) (hợp tự).

    Chỉ có 2 ngoại lệ. Hai chữ cái nguyên âm nhưng có thể tham gia phụ âm đầu. Chữ i và chữ y.

    Chữ cái y, khi dẫn đầu chữ, có thể là một chữ (trong y tế, sức ỳ, ỷ lại, ý đồ), có thể làm tiền tố cho 7 âm vần dạng u, chưa kể có thể đi trước nhiều âm vần khác nhau (trong các chữ hiếm yang, ye, yum, thậm chí yip). Vì thế, ở vị trí này y luôn được mã hóa bằng đơn tự và mọi lớp hậu tố có thể theo sau đều được mã hóa nhất quán. Nói riêng, trong 7 chữ thông dụng u, lớp hậu tố êu được mã hoá nhất quán bằng 1 ký tự. Vậy, lớp chữ [trọn vẹn] yo được mã hóa nhất quán.

    Chữ cái i phức tạp hơn. Nó có thể là một chữ (i tờ, ì ạch, âm ỉ, ầm ĩ, í ới, ậm ị). Nó có thể đi trước nhiều âm vần. Nó dẫn đầu 7 chữ ghép có dạng u và 10 chữ ghép có dạng iu. Nó lại có thể theo sau nhiều tiền tố khác nhau. Khi ở đầu chữ hoặc ở sau tiền tố thực sự bất kỳ khác g, nó đều được mã hóa trong một ký tự, thường là hợp tự. Ở sau tiền tố g nó được mã hóa bằng đơn tự, theo sau là mã của u, êu. (Ví dụ, trong im, nó được mã hóa trong hợp tự im, trong rin, riêng nó được mã hóa trong hợp tự in, iêng, còn trong gin, giêng, nó được mã hóa bằng đơn tự i.) Trong đó, cũng như sau tiền tố y, sau tiền tố gi lớp êu được mã hoá nhất quán bằng hợp tự. Khác với tiền tố y, sau tiền tố gi còn có 5 lớp hậu tố nữa dạng bx với b là một chữ cái phụ âm, là cx, mx, nx, px, tx.

    Ba lớp, mx, px, tx, mỗi lớp chỉ có một phần tử, hiển nhiên được mã hoá nhất quán. Lớp cx có 2 phần tử, cch, trong đó chỉ có 1 chữ ghép, ch, nên cũng hiển nhiên được mã hoá nhất quán. Lớp nx có 3 phần tử, n, ngnh, được mã hóa nhất quán do cả ng lẫn nh đều được mã hóa theo cùng một cách (hợp tự). Rút cục, sau tiền tố g, lớp hậu tố io được mã hoá nhất quán.

    Vậy, A3 là mã chính quy. Điều phải chứng minh.
    Đã được chỉnh sửa lần cuối bởi Ada : 19-06-2019 lúc 02:11 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  6. #26
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Mặc định một phương pháp mã hóa tiếng Việt

    Nhiều bộ xử lý có thể làm đồng thời vài phép tính, thậm chí mấy phép tính cùng một lúc. Bộ biên dịch tối ưu hóa có thể khai thác khả năng ấy của bộ xử lý. Nhưng bộ biên dịch không phải là thánh. Để việc tối ưu hóa cho code thật tối ưu, cần hỗ trợ từ coder.

    Cho bộ xử lý như thế, quy trình dịch mẫu mực

    Code:
    D -> C -> C* -> B+
    có thể tối ưu hóa thành

    Code:
    D -> C2 -> C2* -> B2+ -> B+
    C2 là một mã có 96 âm vần với cấu trúc giống mã C: đúng một phần tư đầu tiên là các âm vần [nửa] mở lưỡng tính và ba phần tư còn lại là âm vần [nửa] khép lưỡng tính. Có thể xem nó như một "bản thu nhỏ" của C. Cái tên "C2" thật ra ngụ ý "C/2". Mã C2*, B2+, tương tự, là "bản thu nhỏ" của C*, B+ và có thể gọi tên một cách gợi nhớ hơn là "C*/2", "B+/2".

    Bit cuối (bit thấp nhất) của mã âm vần trong mã C, gọi là o, không thay đổi qua chuỗi biến đổi mẫu mực C -> C* -> B+. Tách bỏ nó đi, thì được mã C2. Nói cách khác, mã C2 có thể định nghĩa là mã C thiếu 1 bit cuối ở âm vần. Đó cũng chính là quan hệ giữa C2* với C* và giữa B2+ với B+. Khi đem o nối vào [mã âm vần của] B2+, tất nhiên, ta khôi phục được [mã âm vần của] B+.

    Vậy, hệ thức giữa [mã âm vần của] C và C2, C* và C2*, B+ và B2+ là

    Code:
    vC  = vC2  * 2 + o
    vC* = vC2* * 2 + o
    vB+ = vB2+ * 2 + o
    Trong đó o, bit cuối của vC (và vC*, vB+), có thể tính bởi

    Code:
    o = h1 & v8 | t1 & t2
    với các bit v8, t1, t2 lần lượt là bit cuối của vD (âm vần trong mã D), bit đầu và bit giữa của tD (thanh trong mã D), đã được định nghĩa trước đây. (t1 & t2 thật ra là giá trị của biểu thức tD >= 6.) Còn h1 là giá trị biểu thức vD < 48 hay, nói cách khác, bit đầu (bit dấu) của

    Code:
    h = vD - 48
    Hiển nhiên, công thức dịch D -> C2 là một hàm số có miền giá trị liên tục (nhưng miền xác định thì không) gồm 2 khúc tuyến tính:

    Code:
    vC2 = h1 ? vD / 2  :  vD - 32
    Hiển nhiên, công thức dịch C2 -> C2* (phép chuyển vị ma trận 24 cột thành ma trận 24 hàng) là

    Code:
    vC2* = i + j * 24
       i = vC2 / 24
       j = vC2 % 24
    Hiển nhiên, công thức dịch C2* -> B2+ (phép tính hình thái, tương tự như các phép tính "to upper", "to lower" trên mã ASCII), là

    Code:
    switch (pC2*)
    {
    case '--':...
    case 'b':...
    case 'c':...
    ...
    case 'gi':
        pB2+ = pC2*
        vB2+ = 'ing' <= vC2* < 'e'    ? vC2* + 32  :  vC2*
    case 'g/gh':
        pB2+ = 'êng' <= vC2* < 0xC0/2 ? pC2* + ... :  pC2*
        vB2+ = vC2*
    ...
    case 'ng/ngh':
        pB2+ = 'êng' <= vC2* < 0xC0/2 ? pC2* + ... :  pC2*
        vB2+ = vC2*
    ...
    case 'q':
        pB2+ = pC2*
        vB2+ = 'a'  <= vC2* < 'êng'   ? vC2* + 32  :  vC2*
    ...
    case 'y':
        pB2+ = pC2*
        vB2+ = 'ia' <= vC2* < 'e'     ? vC2* + 32  :  vC2*
    ...
    }
    Quy trình tối ưu C2 -> C2* -> B2+ thực chất là giống hệt quy trình mẫu mực C -> C* -> B+. Bước C2 -> C2* (hay C -> C*) gồm 2 phép tính không thể làm đồng thời (phép chia lấy thương đồng thời lấy dư và phép nhân đồng thời cộng). Bước C2* -> B2+ (hay C* -> B+) cũng gồm 2 phép tính không thể làm đồng thời (phép thử khoảng và phép cộng). Nên mỗi bước không thể nhanh hơn 2 xung nhịp. Đầu ra của bước nọ là đầu vào của bước kia, nên 2 bước cũng phải đi nối tiếp nhau. Vậy, 2 bước đó mất ít nhất 4 xung nhịp. Code thực tế có thể chạy lâu hơn thế đáng kể.

    Bản chất của sự tối ưu hóa này là thay bước D -> C rắc rối ở trước chuỗi 2 bước rắc rối nói trên bằng bước D -> C2 ở đầu, bước B2+ -> B+ ở cuối, và chuỗi phép tính o song hành với chuỗi 3 bước D -> C2 -> C2* -> B2+.

    Công thức D -> C2 rất đơn giản. Tính thêm cả B2+ -> B+ vẫn đơn giản hơn D -> C đáng kể. Nhờ thế bảo mật dễ hơn. Viết code bảo mật nói chung là khó hơn code thường bởi vì phải đảm bảo code đích không phân nhánh (branchless), nghĩa là không chứa một lệnh nhảy có điều kiện nào. (Đó là chi tiết kỹ thuật viết code, không bàn trong chủ đề này.) Thêm nữa, chuỗi phép tính o dù rắc rối cũng chỉ mất 2 xung nhịp thôi, nghĩa là vẫn nhanh hơn chuỗi 3 bước nhiều, nên chuỗi sau mới là đoạn găng trong đồ thị tính toán, chứ chuỗi o song hành với nó thì không. Do đó, thời gian chạy của chuỗi o đã được che giấu đi, không cần phải lo bảo mật cho nó. Tóm lại, việc tối ưu hoá sẽ rút ngắn đoạn găng và thu nhỏ code mật. Nhất cử, lưỡng tiện.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm qua lúc 07:38 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #27
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Trên một số bộ xử lý, khi viết code theo một yêu cầu đặc thù, như bảo mật, phép thử khoảng a <= x < b với x biến và a, b hai hằng số đã biết từ khi biên dịch sẽ hữu hiệu hơn nếu hai cận là 2 bội nguyên liên tiếp của một luỹ thừa của 2, nghĩa là a = n * 2^kb = (n+1) * 2^k với n, k nguyên [và dương, trong loạt bài này].

    Mã D (và mọi mã khác dẫn xuất từ nó) đã được xếp đặt để có thể viết mọi phép thử khoảng ở dạng "đẹp" này, trong giả thiết rằng trong ngôn ngữ mã D không tồn tại một số từ mã nhất định. Như sẽ chỉ ra sau đây, giả thiết đó hợp lý, an toàn cho hầu hết mọi ứng dụng.

    Mọi hằng số nêu trong danh sách dưới đây đều của mã C*.
    • Sau phụ âm đầu q, để biết âm vần có dạng oa/ua hay không, có thể thử khoảng [a,b) = [0x80, 0xA0), giả thiết từ mã q-a, q-êng, q-êc, q-ing, q-ic không tồn tại.
    • Sau phụ âm đầu g/gh, ng/ngh, để biết âm vần có dạng ia, eo hay êu hay không, có thể thử khoảng [0xA0, 0xC0), giả thiết từ mã gh-êng, gh-êc, gh-ing, gh-ic, ngh-êng, ngh-êc, ngh-ing, ngh-ic không tồn tại.
    • Sau phụ âm đầu gi (hay gi/g), để biết âm vần có dạng iu hay u/u hay không, có thể thử khoảng [0xA0,0xB0), giả thiết từ mã gi-ing, gi-ic không tồn tại. Nói riêng, chữ lô-gíc được giả thiết là không tồn tại; chỉ có lô-gích mà thôi.
    • Sau phụ âm đầu -- (hay y/--), để biết âm vần có dạng u/u hay không, có thể thử khoảng [0xA8,0xB0). Không có giả thiết nào, nhưng trong dị bản mã hoá yêu thành --yêu (phụ âm đầu mã hoá bằng --), cần nhớ rằng khoảng này đã gộp cả mã số 0xA8 vốn biểu thị một âm vần không có dạng u/u. Nếu thay đổi hình thái, 0xA8 trở thành một mã số khác (0xE8, nếu dùng mã B). Vì vậy, bảng mã đích (mã B) phải định nghĩa cả mã số kia để đảm bảo rằng cả hai mã số đều biểu thị cùng một âm vần.


    Một số từ mã, như gh-êng, được giả thiết là không tồn tại trong thực tế, vì chúng biểu thị các chữ vô cùng hiếm.

    Một số từ mã không tồn tại ngay cả trên lý thuyết. Một số, như q-a, không tồn tại vì giải mã thành một chữ sai chính tả. (Tác giả chữ qa chắc sẽ muốn chữa nó thành ca, ka hay qua.) Một số khác, không có mặt trong các giả thiết trên, như q-ua, gi-êng, gi-êc, gi-ia, gi-iu, cũng không tồn tại bởi vì nếu mã hóa như thế thì sai, nghĩa là giải mã thành một chữ thực ra đã được mã hóa bằng một từ mã khác. (Chữ qua được mã hoá là q-oa, giênggi-iêng, giêcgi-iêc, giagi-a, và giugi-u.)

    Bốn ví dụ sau cũng là ví dụ về một số âm tiếng Việt nói được mà chữ Việt lại không viết được (nghĩa là có thể mã hoá được bởi mã D nhưng từ mã, đến bây giờ, vẫn bỏ không). Nếu âm ấy được viết ra thành chữ theo đúng quy tắc đánh vần, thì trớ trêu, cũng theo đúng quy tắc đánh vần, chữ ấy được hiểu thành âm khác.

    Chúng được hiểu như thế bất kể có dấu thanh hay không và, nếu có, đặt ở đâu. Phương pháp mã hoá của mình dựa trên giả thiết có thể di dời dấu thanh ra khỏi vị trí của nó mà vẫn bảo toàn thông tin, nghĩa là vị trí đặt dấu thanh được suy hoàn toàn từ chữ không dấu thanh. Đó là mô hình giản lược, nhưng mình không phải là người duy nhất theo mô hình này. Thứ tự sắp xếp chính tả, từ điển tiếng Việt từ mấy trăm năm nay dựa vào đó. Mã điện tín, có người gọi là "mã dây thép", "mã TELEX", ít nhất 100 năm nay, dựa vào đó. Các phần mềm gõ tiếng Việt, có từ 30 năm nay, cũng dựa vào đó.

    Trong mô hình này, giâu gia (ria), giầm gìa (dìa), giúc gỉa (rỉa), giặc gĩa (dĩa), giặt gịa (dịa), giu giu (riu), giập gìu (dìu), gian gíu (díu), giằng gịu (dịu),... không tồn tại; giêm giẩm (rêm rẩm), giên gỉ (rên rỉ), kỹ sư Giêm Oát (James Watt), tiểu thư Giên Grê (Jane Grey),... cũng không tồn tại.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm qua lúc 12:23 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  8. #28
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    557

    Nếu muốn giải mã tiền tố (để tính thứ tự chính tả) một chữ yêu đã được mã hoá (trong mã D) bằng từ mã --yêu hơn là y-yêu, ta vẫn có thể dịch ra B+, rồi A3'. Nhưng xem xét một tý sẽ thấy cho mục đích này, B+ và A3' không tối ưu.

    Ta biết rằng chuỗi D -> C -> B+ -> A3' dịch --yêu thành y-êu. Mã B+, A3' chỉ dành cho mã âm vần 1 byte, nghĩa là chỉ đủ cho êu còn y bắt buộc phải đẩy vào phụ âm đầu. Phép tính hình thái này tính lại (biến đổi) cả âm vần lẫn phụ âm đầu. Nghĩa là 02 phép cộng. Nghĩa là ta đã vượt định mức. Một phép tính hình thái chỉ được phép dùng 01 phép cộng thôi. Không hơn và, nếu bảo mật, không kém.

    Thị trường khắc nghiệt. Nó không có chỗ cho những công nghệ hạng nhì.

    Nếu, bên cạnh định mức tiêu chuẩn về số phép tính đó, "ngân sách" về tiêu thụ bộ nhớ (ROM) cũng eo hẹp tương tự như mã B+, ta có thể dùng một phiên bản khác của B+ mà dịch --yêu thành --yêu. Mã B++.

    B++ là hợp của mã B và B+. Bảng mã âm vần của nó (Bảng 3f) có mọi mã của cả B lẫn B+. Tương tự như với B+, A3, A3' trước đây, giải mã tiền tố B++, thì được mã A4. Sắp xếp lại bảng ký tự của mã A4 theo thứ tự chính tả, thì được mã A4'. (Bảng 3g).

    Bảng 3f. Bảng mã âm vần của mã B++.
    Code:
         0_   1_   2_   3_   4_   5_   6_   7_    8_   9_   A_   B_   C_   D_   E_   F_  
    =====================================================================================
    _0   ai   âu   o    ơ    uê   ua   ư    ưu    a    oau  i    e         uau  --       
    _1   ay   uâu  ô    u    uya  uơ   ưa   ươu   oa   oay  iu   eo   ua   uay  u?       
    _2   am   ăng  ong  ơm   uâm  uênh uơng ương  oam  oăng im   em   uam  uăng m        
    _3   ap   ăc   oc   ơp   uâp  uêch uơc  ươc   oap  oăc  ip   ep   uap  uăc  p        
    _4   an   âm   oong ơn   uân  uôm  ưm   uyên  oan  oem  in   en   uan  uem  n        
    _5   at   âp   ooc  ơt   uât  uôp  ưp   uyêt  oat  oep  it   et   uat  uep  t        
    _6   ang  ân   ôm   ơng  uâng uôn  ưn   uyêng oang oen  inh  eng  uang uen  nh       
    _7   ac   ât   ôp   ơc   uâc  uôt  ưt   uyêc  oac  oet  ich  ec   uac  uet  ch       
    _8   ao   ây   oi   ơi   uêu  uôi  ưi   y     oao  oe   ia   ê    uao  ue   a?   ia? 
    _9   au   uây  ôi   ui   uyu  uơi  ươi  uy    oai  oeo  iêu  êu   uai  ueo  êu   yêu 
    _A   anh  âng  ôn   um   uêm  uông ưng  uym   oanh oeng iêm  êm   uanh ueng êm   yêm 
    _B   ach  âc   ôt   up   uêp  uôc  ưc   uyp   oach oec  iêp  êp   uach uec  êp   yêp 
    _C   ăm   om   ông  un   uên  uơm  ươm  uyn   oăm  êng  iên  ên   uăm       ên   yên 
    _D   ăp   op   ôc   ut   uêt  uơp  ươp  uyt   oăp  êc   iêt  êt   uăp       êt   yêt 
    _E   ăn   on   ôông ung  uêng uơn  ươn  uynh  oăn  ing  iêng ênh  uăn  ng   êng  yêng
    _F   ăt   ot   ôôc  uc   uêc  uơt  ươt  uych  oăt  ic   iêc  êch  uăt  c    êc   yêc
    Bảng 3g. Tập hợp 250 ký tự của mã A4, A4'.
    Code:
    --  ât  êu   m    oe   ôt   uat  uet  uơm   ưn  
    a   âu  f    n    oec  ơ    uau  uê   uơn   ưng 
    ac  ây  g    ng   oem  ơc   uay  uêc  uơng  ươc 
    ach b   h    nh   oen  ơi   uăc  uêch uơp   ươi 
    ai  c   i    o    oeng ơm   uăm  uêm  uơt   ươm 
    am  ch  ia   oa   oeo  ơn   uăn  uên  up    ươn 
    an  d   ic   oac  oep  ơng  uăng uêng ut    ương
    ang đ   ich  oach oet  ơp   uăp  uênh uy    ươp 
    anh e   iêc  oai  oi   ơt   uăt  uêp  uya   ươt 
    ao  ec  iêm  oam  om   p    uâc  uêt  uych  ươu 
    ap  em  iên  oan  on   q    uâm  uêu  uyêc  ưp  
    at  en  iêng oang ong  r    uân  ui   uyên  ưt  
    au  eng iêp  oanh ooc  s    uâng um   uyêng ưu  
    ay  eo  iêt  oao  oong t    uâp  un   uyêt  v   
    ăc  ep  iêu  oap  op   u    uât  ung  uym   w   
    ăm  et  im   oat  ot   ua   uâu  uôc  uyn   x   
    ăn  ê   in   oau  ô    uac  uây  uôi  uynh  y   
    ăng êc  ing  oay  ôc   uach uc   uôm  uyp   yêc 
    ăp  êch inh  oăc  ôi   uai  ue   uôn  uyt   yêm 
    ăt  êm  ip   oăm  ôm   uam  uec  uông uyu   yên 
    âc  ên  it   oăn  ôn   uan  uem  uôp  ư     yêng
    âm  êng iu   oăng ông  uang uen  uôt  ưa    yêp 
    ân  ênh j    oăp  ôôc  uanh ueng uơ   ưc    yêt 
    âng êp  k    oăt  ôông uao  ueo  uơc  ưi    yêu 
    âp  êt  l    oc   ôp   uap  uep  uơi  ưm    z
    So với B+, mã B++ có thêm 7 mã âm vần có dạng u. Cả 7 đều được bảo toàn trong mã A4, A4' dưới dạng 7 ký tự (hợp tự) để mã hoá hậu tố u tương ứng. Vậy, lớp hậu tố yo được mã hoá nhất quán và A4, A4' là mã chính quy.

    Mã A4 có nhiều hơn 256 ký tự, nhưng chả sao. Điều chính vẫn là (i) B++ có không quá 256 mã âm vần và, tương ứng, không quá 256 ký tự của A4 được dùng làm khoá (chỉ số) tra bảng (mảng) hậu tố, vốn là một bảng (mảng) có đúng 256 phần tử; còn bớt được 8 phần tử nếu ta chịu khó hoán vị trên bảng mã âm vần, đưa khoảng trống về cuối; và (ii) A4, A4' chỉ có 250 ký tự phân biệt (1) và, do thế, A4' vẫn là một mã 8 bit, mỗi phần tử vẫn chỉ chiếm 1 byte. Cả hai bảng (mảng) tiền tố và hậu tố chiếm 32*2 + 256*1 = 320 byte. Và với hoán vị trên, còn có thể tiết kiệm 8 byte nữa.

    Tất nhiên, khi làm cách này, ta đã giả thiết hoàn toàn không dùng mã y ở phụ âm đầu. Nói cách khác, ngôn ngữ nguồn chỉ có đúng 8 chữ y, yêc, yêm, yên, yêng, yêp, yêt, yêu bắt đầu bằng y mà thôi. Những chữ yang, , ,... nếu có mặt trong văn bản, đều là ngoại ngữ.

    ____________________
    (1) Nói "ký tự phân biệt" ở mã A3, A4 không ngụ ý phân biệt ở giá trị (nhị phân) của chúng. "Phân biệt" là phân biệt theo ngoại hàm, tức ý nghĩa "bề ngoài" mà chúng biểu thị bỏ qua ngữ cảnh. Hai ký tự bất kể theo sau tiền tố nào nếu cùng biểu thị một xâu chữ cái thì được xem là "không phân biệt". Nói chính xác hơn, A3 (A4) có 243 (250) lớp tương đương các ký tự đồng nghĩa (không phân biệt), mỗi lớp tương ứng một cách tự nhiên với một ký tự của A3' (A4').
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm qua lúc 07:35 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Các đề tài tương tự

  1. Dịch vụ gửi hàng hóa đi Australia, gửi hàng hóa đi France, gửi hàng hóa đi Germany, gửi hàng hóa đi Janpan giá rẻ.
    Gửi bởi sales5ttico trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 30-07-2014, 02:51 PM
  2. Tính thành tiền trong bảng hóa đơn từ bảng chi tiết hóa đơn
    Gửi bởi tuanvi261 trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 06-05-2013, 08:32 PM
  3. Hóa chất làm giảm điện trở đất, bột than tiếp địa, cọc tiếp địa, cọc thép mạ đồng, kim thu sét ese
    Gửi bởi chong set trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-04-2012, 12:33 PM
  4. Gọi hàm con.. tiến hóa khôn lường
    Gửi bởi luckyfor trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 06-10-2011, 03:58 PM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn