• Thứ Sáu, 03/06/2005 23:16 (GMT+7)

    Unicode - Chuẩn hoá tiếng Việt (tiếp theo): Thực trạng hỗ trợ mã Unicode trên Linux

    Trong mục này tôi trình bày thực trạng hỗ trợ mã Unicode trên HĐH Linux RedHat 7.2 vì đây là version mới nhất và hỗ trợ Unicode tốt nhất. Các vấn đề được trình bày là khả năng nhập dữ liệu dùng mã Unicode, danh sách các ứng dụng hỗ trợ mã Unicode, cấp độ hỗ trợ mã Unicode ở mức lập trình các ứng dụng “text mode”, cấp độ hỗ trợ mã Unicode ở mức lập trình X-Windows và cấp độ hỗ trợ mã Unicode ở mức lập trình dùng thư viện trực quan cao cấp Qt (middleware).

    Nhập liệu mã Unicode

    HĐH chỉ hỗ trợ việc nhập dữ liệu mã Unicode ở dạng tổng quát và rất thô, để có 1 ký tự bạn phải nhập 4 phím số hexadecimal mô tả mã Unicode của ký tự đó. Hơn nữa sự hỗ trợ này chỉ hoạt động tốt ở chế độ “text mode console” chứ chưa chạy được trong X-Windows. Để nhập liệu và hiển thị tốt mã Unicode ở chế độ “text mode”, bạn phải:

    1. Thiết lập chế độ xử lý văn bản theo mã utf8. Linux (hay Unix) sử dụng khái niệm “locale” để thiết lập chế độ xử lý văn bản của nó. “Locale” là tập hợp các qui định cụ thể về tập ký tự được dùng, cách nhập liệu, các ký hiệu tiền tệ, thời gian, cách sắp xếp các chuỗi ký tự,... Có khá nhiều “locale” tạo sẵn bởi Linux và bạn có thể tạo thêm bất kỳ “locale’ mới nào. Thí dụ “locale” mặc nhiên của Linux là en_US, để tạo mới (nếu chưa có) “locale” nới rộng en_US.UTF-8 hầu xử lý đúng mã Unicode UTF8, bạn có thể dùng hàng lệnh sau:

    localedef -v -c -i en_US -f UTF-8 /usr/share/locale/en_US.UTF-8

    rồi thêm hàng lệnh định nghĩa biến môi trường:

    export LANG=en_US.UTF-8

    vào file /etc/profile. Từ đây mỗi khi khởi động máy ở chế độ “text mode” và login vào bất kỳ user account nào thì Linux cũng sẽ hoạt động ở chế độ Unicode.

    2. Dùng lệnh “kbd_mode -u” để chuyển về chế độ nhập liệu Unicode.

    Mỗi khi cần nhập 1 ký tự Unicode, bạn phải ấn và giữ phím Alt-Right rồi nhập tuần tự 4 ký số hexadecimal mô tả mã Unicode cần nhập (thí dụ 1ec5 là mã ký tự “ễ”).

    Tuy nhiên cách nhập liệu Unicode như trên quá phức tạp, hơn nữa người dùng Linux chủ yếu sử dụng môi trường đồ họa trực quan X-Windows. Hiện tại tùy thuộc vào mỗi quốc gia, người ta phải tạo một module keyboard driver riêng để cho phép nhập liệu dễ dàng các ký tự của quốc gia mình theo mã Unicode. Về tiếng Việt Unicode, hiện cũng có vài trình hỗ trợ, trong đó phải kể đến hệ hỗ trợ nhập liệu tiếng Việt tổng quát GVSBK 2.x.

    Các ứng dụng hỗ trợ Unicode

    Trong version RedHat 7.2 đã xuất hiện một số ứng dụng hỗ trợ mã Unicode, tập trung chủ yếu vào các nhóm sau:

     Nhóm ứng dụng văn phòng như bộ KOffice gồm KWord, KSpread, KPresenter, KChart. Lưu ý là StartOffice 5.2 của Sun là bộ ứng dụng rất mạnh và được dùng phổ biến trong cộng đồng Unix lại chưa hỗ trợ mã Unciode, nhưng theo thông báo của Sun thì bộ StartOffice version 6.0 cũng hỗ trợ tốt mã Unicode (chưa có bản chính thức, mới có bản beta)...

     Nhóm ứng dụng soạn thảo văn bản như Text Editor, Advanced Editor, Kate,...

     Nhóm ứng dụng duyệt web như Mozilla, Konqueror, Netscape 4.76...

     Nhóm các ứng dụng giả lập terminal như xterm, Linux Console... để chạy các ứng dụng “text mode”.

    Để các ứng dụng trên hoạt động tốt với Unicode, bạn cần thiết lập X-Windows chạy ở chế độ locale utf8 gồm trình tự các thao tác sau:

     Nếu locale “en_US.UTF-8” chưa có trên máy bạn thì hãy dùng lệnh localedef để tạo mới locale này (xem lại phần trên để biết chi tiết các thông số của lệnh localedef).

     Dùng trình soạn văn bản mở file /etc/sysconfig/i18n rồi sửa hàng lệnh LANG thành LANG=en_US.UTF-8.

     Chọn menu Start.Preference.Personalization.Country & Language, chọn trang Locale, chọn mục iso10646-1 trong listbox “Charset”.

    Hỗ trợ mã Unicode ở cấp hệ thống

    Kernel Linux hỗ trợ đầy đủ mã Unicode ở cả 2 dạng mã UTF8 và UCS2, trong đó UTF8 là chủ yếu. Để viết các ứng dụng chạy ở chế độ “text mode” trong các cửa sổ terminal và hiển thị được văn bản Unicode, bạn có thể gọi họ các hàm printf() truyền thống. Lưu ý là để ứng dụng hiển thị tốt mã Unicode, bạn cần thiết lập chế độ utf8 cho cửa sổ terminal.

    Môi trường lập trình C++ được dùng trong các thí dụ sau là KDevelop sẵn có trong giao diện KDE của Linux. Giống như VC++ trong Windows, môi trường này cũng không cho phép nhập trực tiếp hằng chuỗi Unicode nên ta sẽ nhập bằng một trình soạn thảo văn bản khác như Text Editor, cất văn bản lên file theo dạng mã utf8 rồi “include” vào file chương trình *.cpp để dùng lại. Thí dụ ở bảng 5 là ứng dụng nhỏ hiển thị mã Unicode trong cửa sổ console hay xterm. 

    Bảng 5

    // source code chương trình chạy ở chế độ “text mode”

    #include

    #include

    #include

    #include

    #include

    // dùng lại file chứa hằng chuỗi utf8

    #include “utf8str.h”

    #define BYTE unsigned char

    // chương trình chính

    int main() {

    wchar_t ucs2str[256];

    int dcnt;

       // khởi động ứng dụng về locale hiện hành

       // cần phải ở locale utf8 thì ứng dụng mới hiển thị đúng   if (!setlocale(LC_CTYPE, “”)) {

          fprintf(stderr, “Can’t set the specified locale! “

                  “Check LANG, LC_CTYPE, LC_ALL.\n”);

          return 1;

       }

       //hiển thị chuỗi theo mã utf8   printf(“UTF-8 : %s\n”,utf8str);

       printf(“UTF-8 : %s\n”,pcstr_utf8);

       //hiển thị chuỗi theo mã UCS2   dcnt = utf8toucs2((BYTE*)utf8str,ucs2str);

       printf(“UCS-2 : %ls\n”, ucs2str);

       printf(“UCS-2 : %ls\n”, pcstr_ucs2);

       return 0;

    }

    Hỗ trợ Unicode của X-Windows

    Ngoài các hàm xử lý chuỗi ASCII truyền thống, X-Windows cũng cung cấp thêm các hàm API riêng để xử lý mã Unicode, thí dụ nếu hàm XDrawString() truyền thống cho phép hiển thị văn bản ASCII trong cửa sổ X-Windows thì hàm XDrawString16() cho phép hiển thị văn bản Unicode, đối số của hàm XDrawString16 là pointer tới  danh sách các record kiểu XChar2b, mỗi record chứa 2 byte mô tả 1 ký tự Unicode như sau:

    typedef struct {

      unsinged char byte1; // trọng số cao

      unsigned char byte2; // trọng số thấp

    } XChar2b;

    Thí dụ bảng 6 cho phép hiển thị chuỗi văn bản tiếng Việt Unicode bằng cách gọi hàm XDrawString16() :

    Bảng 6

    // thí dụ hiển thị chuỗi utf8 dùng XDrawString16

    #include “utf8str.h”

    XChar2b str2b[256];

    int cnt2b;

       cnt2b = utf8toXChar2b(utf8str,str2b);

       XDrawString16(display, window, gc, x, y,str2b,cnt2b);

    Hỗ trợ Unicode của thư viện lập trình cao cấp

    Thư viện lập trình trực quan cao cấp Qt cung cấp 2 kiểu dữ liệu QString và QChar, cho phép xử lý chuỗi văn bản mã Unicode, mỗi QChar chứa được 1 ký tự Unicode theo mã UCS2 (2 byte). Thí dụ đoạn code trong bảng 7 hiển thị chuỗi Unicode lên điều khiển static text và text edit trong dialogbox:

    Bảng 7

    // dùng lại file chứa hằng chuỗi utf8

    #include “utf8str.h”

    // tạo 1 static text

    TextLabel1 = new QLabel( this, “TextLabel1” );

    TextLabel1->setGeometry( QRect( 0, 10, 571, 31 ) );

    QFont TextLabel1_font(  TextLabel1->font() );

    // hiệu chỉnh font Unciode để hiển thị

    TextLabel1_font.setFamily( “arrus” );

    TextLabel1->setFont( TextLabel1_font );

    // hiển thị chuỗi utf8 lên static text

    TextLabel1->setText(QString::fromUtf8(utf8str,-1));

    // tạo 1 line edit

    LineEdit1 = new QLineEdit( this, “LineEdit1” );

    LineEdit1->setGeometry( QRect( 0, 50, 571, 31 ) );

    QFont LineEdit1_font(  LineEdit1->font() );

    // hiệu chỉnh font Unciode để hiển thị

    LineEdit1_font.setFamily( “arrus” );

    LineEdit1->setFont( LineEdit1_font );

    // hiển thị chuỗi utf8 lên line edit

    LineEdit1->setText(QString::fromUtf8(utf8str1,-1));

    Lưu ý là trong khi thiết kế trực quan các phần tử menu, dialog box bằng trình Qt Designer, bạn có thể nhập trực tiếp văn bản Unicode. Đây là điểm khá mạnh của Qt so với môi trường VC++ của Microsoft.

    Kết luận

    Nếu đứng về góc độ người dùng đầu cuối, hiện nay số lượng ứng dụng hỗ trợ Unicode còn khá khiếm tốn và chỉ tập trung vào 2 lĩnh vực chính: điện toán văn phòng và truy xuất mạng. Hơn nữa sự hỗ trợ của các ứng dụng thường chỉ dừng lại ở mức nhập liệu, hiển thị và in ấn chứ chưa cung cấp các chức năng xử lý đầy đủ (như tìm kiếm, sắp xếp thứ tự,...). Do đó còn sớm để buộc mọi người phải dùng chuẩn Unicode tiếng Việt trong tài liệu của họ. Nhiệm vụ quan trọng hiện tại của giới chuyên môn là chuẩn bị các tiện ích chuyển mã đủ mạnh và hiệu quả để có thể chuyển mã tiếng Việt cũ trong các tập tin có format rất khác nhau của ứng dụng sang Unicode và ngược lại. Hiện chúng ta cũng có 1 số tiện ích chuyển mã nhưng chỉ làm việc tốt trên các file do bộ Office tạo ra, còn các file dạng khác như CorelDraw, PhotoShop, PageMaker, AutoCad... vẫn chưa chuyển được.

    Riêng về cấp độ lập trình các ứng dụng, ta hoàn toàn có thể lập trình các ứng dụng hỗ trợ Unicode để phục vụ người dùng đầu cuối, mặc dù chưa đủ tự nhiên như lập trình các ứng dụng xử lý chuỗi ASCII truyền thống.

    TS Nguyễn Văn Hiệp

    ID: A0201_65