• Thứ Ba, 30/03/2004 15:03 (GMT+7)

    Unicode vẫn chưa có con đường riêng cho Việt Nam

    Khi tôi quyết định sang Mỹ cách đây 4 năm, đó là một trong những lựa chọn quan trọng nhất của đời tôi. Sống xa nhà là chuyện rất khó khăn, vì tôi đã biết mình sẽ sống ở đó một thời gian dài. Nhưng nhờ có các tiến bộ của công nghệ thông tin, tôi cảm thấy mình vẫn đang ở gần nhà khi gặp em mình trên mạng mỗi ngày và có thể trò chuyện cùng nhau. Dù cách xa nhau nửa vòng Trái đất, chúng tôi vẫn biết được mọi chi tiết về cuộc sống của nhau.

    Chúng tôi sử dụng Windows Messenger, phần mềm nhắn tin nhanh qua Internet có sẵn trong Windows XP. Là một người sử dụng "tầm tầm", em tôi phải cài lại mỗi lần máy chạy không ổn định (thật nực cười, đây thường lại là phương thuốc chữa bách bệnh cho các máy tính cá nhân); và chúng tôi thường phải mất một thời gian ngắn trước khi có thể liên lạc lại. Nhưng cuối cùng thì mọi chuyện đều ổn thỏa.

    Vấn đề khó chịu nhất là chúng tôi phải liên lạc theo kiểu gõ tiếng Việt không dấu, và thường xuyên phải hỏi lại ý nghĩa của mỗi từ. Tôi sử dụng tiếng Việt hỗ trợ sẵn trong Windows XP trong khi em tôi sử dụng font tiếng Việt ABC để tương thích với bạn bè và đồng nghiệp. Người Việt Nam hiện nay vẫn còn gặp rất nhiều khó khăn trong việc trao đổi thông tin trên máy tính, do việc thiếu một bảng mã tiếng Việt thống nhất cho tất cả mọi người

    Vào đầu những năm 80, máy tính cá nhân đã bắt đầu du nhập vào Việt Nam với số lượng hạn chế và chủ yếu được sử dụng trong các công sở. Hầu hết chúng đều dùng MS-DOS, hệ điều hành giao diện text do Microsoft sản xuất. Đa phần máy tính chỉ được dùng như một chiếc máy chữ cao cấp, sử dụng các phần mềm soạn thảo văn bản như kiểu WordPerfect. Nhưng ngay sau đó, mọi người đều thấy cần có một chương trình để soạn thảo tiếng Việt, và đó chính là lý do ra đời của BKED hay VIETSTAR. Một số hãng khác viết ra các trình điều khiển bàn phím và máy in để hỗ trợ tiếng Việt cho WordPerfect và Microsoft Word. Các giải pháp này làm việc tốt trong vòng vài năm, và người dùng tương đối thỏa mãn cho đến khi Windows 3.1 xuất hiện.

    Windows 3.1 và các ứng dụng của nó như Microsoft Word 2.0 hay Microsoft Office 4.3 Suite nhanh chóng chứng tỏ những lợi thế của chúng. Việt Nam không phải là một ngoại lệ của định luật Moore, và việc chuyển đổi sang Windows đã diễn ra hết sức nhanh chóng. Một trong những lý do thúc đẩy việc này là các lập trình viên Việt Nam đã có thể xây dựng các chương trình gõ tiếng Việt và phát triển các bộ font True Type hỗ trợ tiếng Việt trong Windows một cách dễ dàng.

    Các chương trình như vậy xuất hiện khắp nơi. Có lúc có tới hơn 40 bộ gõ tiếng Việt có mặt trên thị trường. Nhiều công ty cố phát triển bộ gõ và bộ font của riêng mình để thúc đẩy việc bán phần cứng. Vấn đề không có một chuẩn thống nhất về bảng mã một phần là do người dùng thường chỉ quan tâm tới việc soạn và in tài liệu tại chỗ.

    Mặc dù có rất nhiều bảng mã được sử dụng, chỉ có hai cách mã hóa tiếng Việt thành các byte (trước kỷ nguyên của Unicode, mỗi ký tự được đại diện bằng một byte-hay 8 bit). Bảng chữ cái tiếng Việt bao gồm 28 chữ cái và 5 dấu thanh:

                A +   = Ắ

    Một số bảng mã quyết định sử dụng một ký tự cho mỗi chữ cái  hay mỗi dấu thanh, sau đó kết hợp các nguyên âm và dấu thanh khi vẽ lên màn hình hoặc xuất ra máy in. Các bảng mã khác tìm cách đưa tất cả các tổ hợp chữ cái/dấu vào bảng mã. Trong thực tế thì người miền Nam thích cách tiếp cận thứ nhất (mã tổ hợp) còn người miền Bắc thích cách tiếp cận thứ hai (mã dựng sẵn).

    Tổ hợp tất cả các nguyên âm và dấu thanh, chúng ta sẽ có được 134 kết quả. Trong thực tế 8 bit chỉ có thể biểu diễn được 256 ký tự khác nhau, và 134 ký tự sẽ chiếm quá nhiều vị trí trong bảng mã, thậm chí còn đè vào phần mã điều khiển. Một trong những giải pháp được lựa chọn là sử dụng hai bộ font khác nhau cho chữ hoa và chữ thường. Mặc dù mã tổ hợp không gặp vấn đề này, nó lại yêu cầu phải xử lý phức tạp hơn.

    Kể từ Windows 95, Microsoft đã giới thiệu phiên bản Windows riêng cho thị trường Việt Nam với tên gọi Microsoft Windows 95 Vietnamese Edition. Trong bài viết này, tôi sẽ sử dụng thuật ngữ Windows 9x thay cho tất cả các hệ điều hành dựa trên nhân Windows 95 như Windows 95, Windows 98 và Windows ME. Trước khi ra mắt Windows 2000 và Windows XP, các hệ thống Win9x đều sử dụng khái niệm trang mã (code page) cho các ngôn ngữ mà nó hỗ trợ.

    Mỗi hệ thốngWin9x đều có trang mã mặc định (hay trang mã hệ thống). Các chuỗi ký tự của hệ thống (trừ khi được chỉ định khác) đều coi là được mã hóa với trang mã hệ thống. Trang mã hệ thống không thể thay đổi, vì thế Microsoft đã tung ra nhiều bản Win9x khác nhau cho mỗi thị trường. Cũng vì thế mỗi phiên bản Win9x chỉ có thể hỗ trợ thêm một ngôn ngữ ngoài tiếng Anh, chẳng hạn như bản Windows 98 tiếng Ả Rập và bản Windows 98 tiếng Thái là hai sản phẩm hoàn toàn khác nhau. Mỗi trang mã có một số định danh (ID) khác nhau. Trang mã cho tiếng Anh Mỹ có ID là 1252, tiếng Thái là 874 và tiếng Việt là 1258.

    Trang mã tiếng Việt 1258 sử dụng phương pháp mã kiểu tổ hợp. Không chỉ cho Việt Nam, cách tiếp cận này được sử dụng cho hầu hết các loại chữ viết thuộc họ Complex Script khác vì nó cho phép thể hiện nhiều ký tự trong khoảng giới hạn 256 vị trí của bảng mã ASCII. Chẳng hạn như với tiếng Thái:

    Tiếng Việt: 

    Trong tiếng Hindi, tiếng Thái, hay tiếng Việt, một tổ hợp các ký tự như trên được coi là một đơn vị. Chúng tôi gọi nó là một ký tự phức (complex character), hay một cụm (cluster). Một cụm có thể bao gồm hai hay nhiều ký tự trong trang mã. Vì một cụm có thể chứa nhiều hơn một ký tự, xuất hiện khái niệm định dạng theo ngữ cảnh (contextual shaping), khi cùng một ký tự có thể được đặt ở nhiều vị trí khác nhau, và thậm chí có nhiều hình dạng khác nhau:


    Windows 95 Vietnamese Edition không được đón nhận nhiệt tình, và cũng không được Chính Phủ ủng hộ. Máy tính ngày càng trở nên phổ biến, và người dùng máy tính vẫn tiếp tục sử dụng nhiều bảng mã khác nhau. Tuy nhiên, họ bắt đầu gặp khó khăn khi có nhu cầu trao đổi thông tin. Chính Phủ đã nhận thức được vấn đề này và đã đưa ra bảng mã chuẩn ABC dựa trên cách mã dựng sẵn. Chính phủ cũng cung cấp font chữ và một chương trình gõ tiếng Việt, và khuyến cáo các cơ quan, tổ chức cũng như người dùng sử dụng. ABC nhanh chóng được chấp nhận ở miền Bắc, nhưng người dùng miền Nam vẫn sử dụng những bảng mã khác, chủ yếu là VNI vì nhiều lý do khác nhau, mà một trong số đó là vấn đề font chữ. Các bộ font chữ của ABC không có chất lượng mỹ thuật cao như những bộ font thương mại do các công ty chuyên nghiệp sản xuất.

    Trong cùng khoảng thời gian đó, Microsoft đang xây dựng Windows 2000, hệ điều hành quốc tế đầu tiên sử dụng chuẩn Unicode (Unicode chỉ được sử dụng bên trong Windows NT). Unicode là một chuẩn mã hóa ký tự 16 bit cho phép thể hiện rất nhiều ký tự chỉ trong một bảng mã duy nhất. Trong thực tế, Unicode đã cố gắng "nhồi nhét" tất cả các loại chữ viết phổ biến trên thế giới vào một bảng mã. Chuẩn mới này đã nhanh chóng trở thành chuẩn toàn cầu và được tất cả các công ty lớn chấp nhận. Unicode đã được hỗ trợ từ Win9x, nhưng sự hỗ trợ khi đó còn rất hạn chế.

    Ngày càng có nhiều ứng dụng được phát triển sử dụng Unicode, chẳng hạn như Microsoft Office 2000. Việc sử dụng Unicode không có nghĩa là sản phẩm sẽ hỗ trợ tất cả các thứ tiếng có trong Unicode. Một trong các lý do chính là việc xử lý định dạng theo ngữ cảnh. Định dạng theo ngữ cảnh cần hỗ trợ ở cả mức ứng dụng lẫn mức hệ điều hành. Đó là lý do khiến Microsoft Office 2000 (dù là một ứng dụng Unicode), vẫn không thể hiển thị đúng các xâu ký tự tiếng Việt hay tiếng Thái (Microsoft đã cung cấp phiên bản Microsoft Office 2000 South Asian hỗ trợ tiếng Việt, tiếng Thái và tiếng Hindi).

    Ngay cả khi Unicode đã xuất hiện, các trang mã trước đây cũng không biến mất ngay lập tức. Đó là do việc xây dựng các ứng dụng Unicode rất tốn kém trong khi nhiều ứng dụng thường nhắm đến thị trường Mỹ là chủ yếu. Và các lập trình viên vẫn tiếp tục sử dụng các hàm API 8 bit trong ứng dụng của họ. Một số API chuẩn như ExtTextOutA hay DrawTextA cung cấp định dạng theo ngữ cảnh cho trang mã mặc định của hệ thống. Chẳng hạn như ExtTextOutA hiển thị đúng các từ "bánh" hay "cấy" (trong các xâu ký tự ANSI 8 bit), nếu trang mã hệ thống được đặt là Vietnamese CP1258. Vì thế thay vì sử dụng khả năng định dạng theo ngữ cảnh của các lớp hỗ trợ Unicode Uniscribe, nhiều ứng dụng vẫn sử dụng các phương pháp truyền thống để lưu trữ và hiển thị dữ liệu. Các hàm chuyển đổi dữ liệu như MultiByteToWideChar và WideCharToMultiByte vẫn được sử dụng nhiều. Windows 2000 và Windows XP cung cấp một trang mã mặc định để tương thích với các phiên bản Windows khác. Nếu dữ liệu của bạn đột nhiên chuyển thành các dấu chấm hỏi (?) khi bạn thay đổi trang mã mặc định, rất có thể là ứng dụng của bạn không hoàn toàn hỗ trợ Unicode.

    Một ví dụ điển hình là chương trình soạn thảo văn bản phổ biến nhất của mọi thời đại - NotePad. Nếu không chỉ định khác, NotePad sẽ tự động lưu trữ tài liệu dưới dạng ANSI 8-bit với trang mã mặc định. Thậm chí ngay cả trình soạn thảo bên trong Visual Studio .NET cũng không hoàn toàn hỗ trợ Unicode. Nếu trang mã hệ thống đang đặt là Vietnamese, các đoạn chú thích tiếng Thái sẽ bị biến hết thành các dấu chấm hỏi, trong khi chú thích tiếng Việt vẫn được hiển thị và lưu trữ đúng. Ngay cả khi chuyển sang Unicode, vấn đề này sẽ còn tồn tại lâu dài vì đa số các ứng dụng quốc tế, nhất là các ứng dụng còn được sử dụng trên Windows 9x, đều sử dụng hỗ trợ của hệ thống.

    Trong thời đại Internet, với chủ trương hòa nhập với thế giới, Chính Phủ Việt Nam đã ban hành chuẩn mới TCVN 6909 dựa trên chuẩn Unicode. Tuy nhiên, dù với Unicode và chuẩn quốc gia mới, mỗi ký tự tiếng Việt phức, hay mỗi cụm, vẫn có thể được trình bày với một trong hai cách: tổ hợp và dựng sẵn. Điều đó có nghĩa là cùng một ký tự có thể được thể hiện trong Unicode với nhiều cách khác nhau:

    Mẹ Mẹ = M + e + . + M + ẹ

    = 0x4d + 0x65 + 0x323 + 0x4d + 0x1eb9

    Một chuỗi như trên được gọi là một chuỗi chưa được chuẩn hóa. Unicode cung cấp chuẩn để chuyển từ các chuỗi chưa chuẩn hóa về các chuỗi đã chuẩn hóa, có thể là theo dạng tổ hợp hoặc theo dạng dựng sẵn (thực tế cũng có nhiều kiểu chuẩn hóa khác nhau):

    Dựng sẵn:

    Mẹ Mẹ = M + ẹ + M + ẹ

    = 0x4d + 0x1eb9 + 0x4d + 0x1eb9

    Tổ hợp:

    Mẹ Mẹ = M + e + . + M + e + .

    = 0x4d + 0x65 + 0x323 + 0x4d + 0x65 + 0x323

    Việc chuẩn hóa là rất quan trọng, vì chỉ sau khi chuẩn hóa các chuỗi mới có thể so sánh dạng nhị phân. Tuy nhiên, đáng tiếc là chưa có hệ thống nào hỗ trợ việc chuẩn hóa một cách tự động theo như tôi được biết. Hầu hết các hệ thống chỉ hỗ trợ việc xử lý các xâu đã được chuẩn hóa sẵn.

    Các ứng dụng của Microsoft đều ủng hộ sử dụng mã hóa kiểu tổ hợp để hiển thị các ngôn ngữ Complex Script, mặc dù các bộ font chữ do Microsoft cung cấp như Times New Roman hay Arial có cung cấp font cho cả hai dạng tiếng Việt (tổ hợp và dựng sẵn). Đó là do việc sử dụng mã Unicode tiếng Việt tổ hợp tương đối giống với việc sử dụng trang mã 1258, chỉ yêu cầu thay đổi số lượng mã lệnh tối thiểu và điều đó cũng có nghĩa là chi phí phát triển phần mềm sẽ giảm đi. Tác giả bài viết được cho biết các công ty lớn như IBM và Oracle cũng hỗ trợ kiểu tiếng Việt Unicode dạng tổ hợp, nhưng thông tin này chưa được kiểm chứng.

    Mặc dù Microsoft Windows có cung cấp API có thể được dùng cho chuẩn hóa, nhưng việc nó có được sử dụng hay không hoàn toàn phụ thuộc vào những nhà thiết kế chương trình ứng dụng. Hầu hết người sử dụng Việt Nam vẫn dùng Microsoft Windows và vì hệ điều hành này không hỗ trợ chuẩn hóa xâu ký tự một cách tự động, cần phải có một chuẩn thống nhất để lưu trữ và hiển thị thông tin. Windows và các ứng dụng khác của Microsoft như Office đều đã hỗ trợ tốt mã tổ hợp. Các ứng dụng khác (đa số sẽ là các chương trình phần mềm nước ngoài) nếu sử dụng các hỗ trợ sẵn có của hệ thống cũng sẽ dùng cách này.

    Người ta có thể triển khai hỗ trợ mã dựng sẵn trong Windows, nhưng việc này sẽ tốn rất nhiều thời gian và nỗ lực, trong khi mã tổ hợp đã được hỗ trợ rất tốt (hỗ trợ ở đây không chỉ bao gồm việc nhập và hiển thị ngôn ngữ). Với quy mô nhỏ của thị trường Việt Nam, tôi cho rằng các công ty lớn như Microsoft và IBM khó có thể triển khai hỗ trợ mã dựng sẵn do không tương thích với các công nghệ đã được đầu tư nghiên cứu lâu nay để hỗ trợ các ngôn ngữ khác thuộc họ Complex Script. Ngay cả khi Chính Phủ thống nhất được một cách mã hóa duy nhất, thời gian để đưa ra các phiên bản tiếp theo hỗ trợ tiêu chuẩn này sẽ kéo dài hàng năm trời vì các hãng phần mềm lớn rất hiếm khi sửa đổi các phần mềm đã đưa ra thị trường ngoài việc chỉnh sửa những lỗi nghiêm trọng.

    Ở đây, tôi không bàn đến cách mã hóa nào tốt hơn về mặt kỹ thuật. Trong thực tế mã dựng sẵn hỗ trợ rất tốt việc hiển thị các chuỗi ký tự phức tạp, và không cần cơ chế định dạng theo ngữ cảnh. Tổ chức W3C (World Wide Web Consortium) cũng đã lựa chọn dạng chuẩn C cho mình trong đó các chuỗi ký tự phức tạp trước hết sẽ được chuyển qua dạng tổ hợp sau đó chuyển về dạng dựng sẵn.

    Vậy cách nào là cách tốt nhất cho Việt Nam? Câu trả lời hiện tại vẫn chưa rõ ràng. Tôi nghĩ chúng ta sẽ cần thời gian để phân tích vấn đề một cách khoa học. So sánh hai cách này trên vấn đề công nghệ rõ ràng là chưa đủ bởi theo tôi nghĩ, thị trường Việt Nam là một thị trường phức tạp, các ứng dụng hầu hết được mua ở nước ngoài và một số ít trong nước được phát triển một cách tự phát. Do vậy, chi phí thực tế có thể sẽ rất khác với những gì mọi người vẫn nghĩ.

    Em tôi vẫn thường xuyên nói chuyện với tôi qua mạng. Tôi rất ngạc nhiên vì cậu ấy vẫn dùng tiếng Việt không dấu, dù tôi đã cài đặt hỗ trợ tiếng Việt trên máy tính ở Việt Nam qua chức năng điều khiển từ xa Windows XP Remote Assistance. Cậu ấy lấy cớ là gõ tiếng Việt không dấu nhanh hơn và phải gõ ít hơn. Dù sao thì tôi cũng hy vọng Việt Nam sẽ sớm hỗ trợ chuẩn Unicode.

    Nguyễn Quang Huy
    Kỹ sư thiết kế phần mềm
    Complex Scripts Development - Microsoft

    ID: B0207_16