BoGoEngine / ibus-bogo

IBus frontend for the BoGo engine.
GNU General Public License v3.0
94 stars 40 forks source link

Hệ thống chuyển đổi bảng mã #65

Open lewtds opened 11 years ago

lewtds commented 11 years ago

Mô tả

Dựa theo kết quả một cuộc bỏ phiếu trên diễn đàn Ubuntu-VN, có thể thấy tính năng chuyển đổi bảng mã cho một văn bản và gõ được bằng các bảng mã ngoài UTF-8 vẫn được số đông rất quan tâm.

Dự định tính năng này sẽ được xây dựng thành một package, define những class con của codecs.Codec tương ứng với từng bảng mã để có thể tích hợp vào hệ thống chuyển đổi bảng mã có sẵn của Python. ibus-engine và công cụ chuyển đổi bảng mã có thể import package này và sử dụng trực tiếp các hàm như string.encode(), bytes.decode(), file.open(),... rất tiện.

Cần phân biệt 2 loại bảng mã là bảng mã độ dài cố định như TCVN3 và những bảng mã có độ dài không cố định như VNI, VIQR,... Đối với loại cố định thì việc chuyển đổi rất đơn giản, sẽ sử dụng hàm lookup có sẵn (viết bằng C) của Python để đạt được tốc độ lớn nhất. Với loại không cố định thì phải tự viết encoder, decoder.

Trong khi việc mã hóa các bảng mã không cố định có thể thực hiện dễ dàng bằng phương pháp lookup (do trong Python, UTF-8 đã là string rồi) thì vấn đề giải mã nói chung là không đơn giản, có thể miêu tả thành quá trình như sau:

segmentation (iterator)
     | <-------------------------+
read_next_char  (byte sequence)  |
     |                           |
  lookup                         |
     |                           |
   write ------------------------+

Phần segmentation là khó thực hiện nhất. Hiện giờ mới có bảng mã VNI được implement, dự tính trong tương lai sẽ tổng quát hóa thành một iterator class dùng chung cho tất cả các bảng mã không cố định.

UPDATE

Một vấn đề nữa cần phải nhắc đến là hiện tượng tự động convert từ ISO-8859-* (các bảng mã 1-byte của châu Âu) sang UTF-8 (đa byte) của nhiều editor và word processor. Vấn đề này có thể được miêu tả bằng VD sau:

Giả định người dùng gõ một đoạn text mã hóa TCVN3 vào một text editor hiện đại (như gedit). Khi gõ, các ký tự có dấu của tiếng Việt sẽ được mã hóa bằng 1 byte theo đúng chuẩn (VD: 'á' -> 0xb8). Tuy nhiên, khi save file, nếu không nêu rõ, các text editor này sẽ đoán bộ mã của text gõ vào (thường là ISO-8859-1) và tự động convert thành UTF-8 (VD: 'á' -> 0xc3 0xa1). Khi cố gắng convert file này thành UTF-8 bằng cách chuyển từng byte một sẽ ra text không đúng (VD: 'á' -> 'ÃĐ').

Implementation hiện tại

https://github.com/lewtds/ibus-bogo-python/compare/lewtds:refactor...lewtds:charsets

Những việc cần phải làm

fuzzysource commented 11 years ago

Mã hóa là convert về Unicode còn giải mã là ngược lại à?

lewtds commented 11 years ago

Ngược lại = ) mã hóa là từ UTF-8 -> TCVN3 (byte sequence), giải mã là TCVN3 -> UTF-8.

Narga commented 11 years ago