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:
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: 'á' -> 'ÃĐ').
Tính năng này mới hoạt động ở mức tối thiểu thì phải, nếu copy (rich text) → convert thì có thông báo là mixed unicode gì đó (tự dưng quên, hiện tại không có file tcvn3 nào, để thứ 2 đi làm kiếm 1 file làm rồi ghi lại) và đoạn mã không convert được (thử trên LibreOffice)
Tính năng này nên đưa thành một mục trên menu, bấm chuột trái hiện ra tùy chọn để convert luôn, không phải bật dialog pref nữa.
Cần hỗ trợ global shortcut để chuyển đổi nhanh
Về lâu dài thì nên tích hợp được tính năng này vào các trình soạn thảo văn bản phổ biên
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:
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