Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 30 kết quả

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

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

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

    MỘT PHƯƠNG PHÁP MÃ HÓA TIẾNG VIỆT

    Đâ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.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-08-2010 lúc 10:52 AM.

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

    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 đầuvần. Ví dụ, xoài có phụ âm đầu là x, vần là oài.

    Vần cấu thành từ thanhâm vần. Ví dụ, oài có thanh huyền, âm vần oai.

    Âm vần có 3 thành phần là âm đệm, chủ âm, và âm cuối. Ví dụ, oai có âm đệm là w, chủ âm là a, âm cuối là j.

    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 để dễ hiểu cho lập trình viên. Tuy vậy, đối với các âm đệm và âm cuối, có khi mình chỉ ra cả ký hiệu phiên âm -- w thay cho u, o còn j thay cho i, y -- để nhấn mạnh rằng mỗi âm đệm và âm cuối đều là một phụ âm, khác hẳn với chủ âm vốn 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), nghĩa là "không có âm" và được viết bằng một xâu trống (nghĩa là... không viết). 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, ở đây mình viết là --).
    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ã, như g/gh, hay ng/ngh, nhưng cũng có khi bằng những mã khác nhau, như c, k, q, hay d, z, hay f, ph, hay gi, j. Ngoài ra còn có những phụ âm "lạ mắt" 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 các vần cùng mã như oai/uai, iêu/yêu và những vần "lạ mắt" như uyêc, thậm chí uêc. 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, nhất là các danh từ riêng và các từ phát âm theo lối địa phương thường xuất hiện trong văn học và báo chí, chẳng hạn như Fai Fô, Sa Pa, Pác Bó, Bắc Kạn, Đa Kao, Kon - tum, Plây - ku, Ja-wa, Nguyễn Sinh Côông, Lý Woòng, Hồ Dzếch, Kuốc Zũng, Yang Fong,...

    Dĩ nhiên là cũng có hạn chế. Còn nhiều chữ mà mình biết nhưng không mã hóa thành tiếng Việt: Đạ Huoai, Đạ Tẻh, Đắk Lắk, Liang Wiang,... Trong đó, thậm chí có cả một số chữ viết sai khá "quen mắt": quỉ, quí, quít, quịt,... Và chắc chắn còn nhiều chữ khác mà mình không biết, được dùng trong thực tế.
    Đã được chỉnh sửa lần cuối bởi Ada : 21-06-2019 lúc 04:20 PM. Lý do: thêm vài ví dụ

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

    Có 13 chủ âm, là a, ơ, e, ê, o, ô, u, ư, i/y, ă (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, gọi là nửa nguyên âm, j (chính tả viết là i, y, ư) và w (chính tả viết là o, u). 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, , oe/ue, oay, uây, ua (tức w-ô), uôn, uy; âm cuối j có mặt trong ai, oai, ơi, uơi, oi, ôi, uôi, ui, ưi, ay (tức e-j), oay, ây (tức ê-j), uây; âm cuối w có mặt trong ao, au, ươu, âu, eo, oeo, êu, uêu, yêu, ưu, iu, uyu. Ngoài ra, wj cũng là một âm đệm, ví dụ, wj-ê trong uya, uyên, uyêt.

    Có 8 phụ âm có thể là âm cuối nhưng không thể là âm đệm, chia thành 2 loại: phụ âm vang, gồm n, m, ng, nh, và phụ âm điếc, gồm t, p, c, ch (tức kh). Ngoài ra, 8 phụ âm này cũng thường được chia thành 4 cặp, mỗi cặp gồm 1 phụ âm vang và 1 phụ âm điếc có âm vị gần nhau, là m-p, n-t, ng-c, nh-ch. Tính gần nhau ấy đã sinh ra một loại từ láy độc đáo, thuần Việt, từ láy vần với phụ âm cuối khác biệt, như nem nép, thin thít, sòng sọc, đành đạch.

    (Đa số học giả cho rằng ở vị trí phụ âm cuối thì ng = nh và, tương ứng c = ch, do vậy loại phụ âm cuối này thật ra chỉ có 6 phụ âm. Ví dụ, icich thật ra chả khác gì nhau, ing với inh thật ra là 1, và do đó theo chính tả lý tưởng 1 trong 2 cách viết nhất thiết phải là sai. Ví dụ nữa, khác biệt giữa bang với banh, giữa bác với bách thật ra không ở phụ âm cuối, mà ở chủ âm: chủ âm trong banh, bách không phải là a mà là ae, hay thậm chí e. Nhưng việc mã hóa ở đây là vấn đề chính tả, hơn là âm vị, nên coi như có 8 phụ âm cuối thì đơn giản hơn.)

    Tương ứng với loại âm cuối, vần được chia thành 4 loại. Vần không có âm cuối (nói cách khác, 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 điếc gọi là vần khép. Ví dụ, a, oa, ơ, , ưa, e, oe, ê, , 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ông thức cấu thành âm nói trên xem như tiếng Việt chỉ có các nguyên âm đơn còn mọi âm khác đều là phụ âm. Thật ra, đó chỉ là một mô hình giản lược. Mục đích của nó là giúp mình liệt kê mọi vần, và giúp lập trình viên tách vần, nghĩa là tách phụ âm đầu và thanh ra khỏi âm vần, hơn là phân tích âm vần thành các thành phần nhỏ hơn. Nhờ đó, ví dụ, yêu tách thành -yêu (hơn là y-êu), quả tách thành q-oả (hơn là q-ủa), quái tách thành q-uái (hơn là qu-ái), tách thành gi-ì (hơn là g-ì hay gi--huyền), giết tách thành gi-iết (hơn là gi-ết hay g-iết), già tách thành gi-à và, cuối cùng, gìa tách thành gi-ìa. Xin nói thêm, khác biệt giữa giàgìa là một ví dụ về vấn đề tiềm ẩn khi giải mã tiếng Việt về dạng Unicode tổ hợp.

    Mô hình chính xác hơn, được thừa nhận rộng rãi xác định tiếng Việt có 3 nguyên âm đôi, vốn là 2 nguyên âm đơn bình đẳng với nhau nối liền nhau. Đó là ua (tức ), ưa (tức ươ) và ia (tức ), lần lượt khác với giá trị "xấp xỉ" w-ô, j-ơ, j-ê mà mình đã nêu ở những đoạn trên. Nhờ mô hình này, nhiều hiện tượng cá biệt có thể được đúc rút ra thành một quy luật. Ví dụ, sự khác nhau về vị trí viết dấu thanh giữa lùaluồn, giữa lừalười, giữa lìaliều có thể được nói gọn rằng ở nguyên âm đôi, dấu thanh được viết trên nguyên âm thứ nhất trong vần mở nhưng đặt trên nguyên âm thứ hai trong vần nửa mở, nửa khép và khép. Ví dụ khác, hiện tượng tươi, tuôn, tiêu ở Nam Bộ được phát âm là tưi, tun, tiu có thể nói gọn rằng ở nguyên âm đôi, Bắc Bộ nhấn mạnh vào nguyên âm thứ hai, Nam Bộ nhấn mạnh vào nguyên âm thứ nhất. Tuy trình bày mô hình chính xác nằm ngoài khuôn khổ của loạt bài này, mình phải thừa nhận rằng mô hình chính xác cũng có lợi ích nhất định trong việc mã hóa tiếng Việt, chẳng hạn, nó giúp lập trình viên (người giải mã) có thể chuyển xâu kết quả về dạng Unicode dựng sẵn.)

    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 (hoặc 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 chung là thanh khứ, còn trong vần khép được gọi chung 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
    (Một lần nữa, xin mở ngoặc nói rằng khi 1 sự vật có 2 tên gọi khác nhau, nghĩa là đã hàm ý có sự khác biệt và như thế không phải là 1 mà thật ra đã là 2. Thanh sắc không phải là 1 mà là 2 thanh, và thanh nặng cũng thế. Ví dụ, cánhcách thật ra là khác thanh, mạngmạc cũng thế. Tóm lại, tiếng Việt có không chỉ 6 thanh, mà những 8 thanh! Để trình bày vài phiên bản đầu của phương pháp mã hóa này, mình tạm coi như tiếng Việt chỉ có 6 thanh. Nhưng chính tính chất 8 thanh đã gợi ý phiên bản hoàn thiện (năm 2018) ở cuối loạt bài này.)
    Đã được chỉnh sửa lần cuối bởi Ada : 11-10-2018 lúc 12:53 AM. Lý do: Nói thêm về câu hỏi: 8 hay 6 phụ âm cuối? 6 hay 8 thanh?

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

    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.
    Đã được chỉnh sửa lần cuối bởi Ada : 30-08-2010 lúc 01:18 AM.

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

    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.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-08-2010 lúc 03:48 PM.

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

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

    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.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-08-2010 lúc 10:03 PM.

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

    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.
    Đã được chỉnh sửa lần cuối bởi Ada : 29-08-2010 lúc 08:16 PM.

  8. #8
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Peter mới thấy nó rất lý thuyết; nhìn vào choáng ngợp! Vậy cậu có thể sinh động nó (thực hành) bằng các ví dụ cụ thể không??? (Code bằng một thứ ngôn ngữ nào đó chẳng hạn). OK?

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

    Trích dẫn Nguyên bản được gửi bởi peterdrew Xem bài viết
    Peter mới thấy nó rất lý thuyết; nhìn vào choáng ngợp! Vậy cậu có thể sinh động nó (thực hành) bằng các ví dụ cụ thể không??? (Code bằng một thứ ngôn ngữ nào đó chẳng hạn). OK?
    Code thì mình không có. Giải mã quá đơn giản, ai cũng code được. Còn mã hóa thì còn phải tùy theo nhu cầu ứng dụng mà xây dựng tiêu chuẩn nhận dạng xâu, định loại xâu, như mình đã viết ở trên. Định được loại xâu rồi thì mã hóa rất đơn giản. Còn đơn giản hơn cả giải mã nữa.

    Nhưng ví dụ thì mình có.



    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).
    Đã được chỉnh sửa lần cuối bởi Ada : 28-08-2010 lúc 09:54 PM.

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

    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.


    (---- hết ----)
    Đã được chỉnh sửa lần cuối bởi Ada : 29-08-2010 lúc 09:54 PM. Lý do: Dẫn nguồn

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