Thursday, December 6, 2007

Tiếng Việt và rắc rối trong lập trình Web

Tôi xin tổng kết lại các hệ thống font chữ VN, để các bạn bắt đầu tập làm web có thể nắm được và khắc phục được lỗi hiển thị chữ tiếng Việt trên các trang web.
I. Thời kỳ tiền Unicode

1. Tổng quan và cách sử dụng
Quay trở lại với những năm 98 trở về trước, ở VN tồn tại rất nhiều các hệ thống bảng mã khác nhau như bảng mã TCVN (ABC), VNI , VIQR... Trong lĩnh vực thiết kế web, các hệ thống bảng mã này được gộp vào một nhóm có tên là User Defined (nhóm font chữ do người dùng tự định nghĩa. Để sử dụng các hệ thống font chữ này, cặp thẻ Meta trong HTML thường có dạng:



Và để hiển thị đúng đắn tiếng Việt trên trang web, việc đầu tiên, các bạn phải chắc chắn rằng font chữ tương ứng trong các thẻ trên trang web đã được cải đặt trên máy. Sau đó, bạn phài vào View/Encoding -> Chọn User defined. Lúc đó thì trang web mới có thể hiển thị đúng tiếng Việt ra cho bạn chọn.

2. Nhận dạng các chủng loại font:

Nếu các bạn lập trình và đẩy dữ liệu vào database, thì tuỳ theo hệ thống font chữ mà nó có thể có các dạng ký tự khác nhau. Chẳng hạn, với dòng chữ "Nhà tôi trên bến sông, có chiếc cầu nhỏ cong cong như con tôm", dòng ký tự sẽ có thể có dạng sau:

- Đối với font ABC (TCVN): "Nhµ t«i trªn bÕn s«ng, cã chiÕc cÇu nhá cong cong nh­ con t«m"
- Đối với font VNI: "Nhaø toâi treân beán soâng, coù chieác caàu nhoû cong cong nhö con toâm"
- Đối với font VIQR: "Nha` to^i tre^n be^'n so^ng, co' chie^'c ca^`u nho? cong cong nhu+ con to^m"

Và tất nhiên, nếu bạn mở một trang web mà thấy một số ký tự ở một trong các dạng trên, các bạn có thể đoán ra trang đó sử dụng hệ thống font chữ gì và tìm cách cài đặt hoặc encode cho hợp lý.

Đặc điểm và nhận dạng của một số hệ thống font chữ phổ biến:

a) Font ABC, hay còn gọi là font TCVN, là các font có tên bắt đầu bằng nhóm ký tự ".Vn", ví dụ: ".VnTime", ".VnArial"... Loại font này được sử dụng nhiều trong soạn thảo văn bản ở miền bắc, nếu tôi không nhầm thì do trường ĐHBK biên soạn. Là loại font 1 byte (1 ký tự được biểu diễn bởi 8 bit)

b) Font VNI, do miền Nam biên soạn. Đây là bộ font 2 byte, có tên bắt đầu bằng chữ "VNI", chẳng hạn "VNI Times"... Loại font này thịnh hành chủ yếu ở miền Nam.

c) Font VIQR: Bản chất nó vẫn chỉ là các ký tự ASCII không hơn không kém, sử dụng một số dấu có sẵn của nó để tạo ra một cái font có vè VN một tí.

Dù sao thì quá khứ kinh hoàng của các bộ font đó đã đi qua. Giờ đây, chúng ta sẽ không nói gì đến những chủng loại font này nữa. Hầu hết các website hiện nay đều sử dụng hệ thống font có tên là Unicode. Chúng ta sẽ làm quen với chúng ở phần II.

II. Unicode - Công nghệ của thời hiện đại

I. Tổng quan về hệ thống font Unicode

Unicode là một bảng mã mới (có thể gọi là dạng mở rộng (rất rộng) của bảng mã ASCII), sử dụng 2 byte cho mỗi ký tự và có khả năng thể hiện 65.536 ký tự khác nhau, cho phép biểu đạt mọi ký tự của tất cả các ngôn ngữ trên thế giới. Nói cách khác, với Unicode, mỗi ký tự của tất cả các ngôn ngữ trên thế giới sẽ có một con số riêng cho mình trong bảng mã. Các font chữ theo chuẩn Unicode được gọi là font Unicode.

Do đây là bảng mã chuẩn cho tất cả các ngôn ngữ trên thế giới nên vấn đề hiển thị ngôn ngữ tiếng Việt không còn gì khó khăn nữa. Bắt đầu từ phiên bản Windows 98 trở lên, Microsoft đã tích hợp trực tiếp bảng mã Unicode vào một số font chính của hệ điều hành như Arial, Times New Roman, Verdana... Điều xui xẻo là khi cài đặt font ABC lên hệ thống, không hiểu các tác giả đã vô tình hay cố ý đè bộ font của họ lên các font hệ thống khiến cho nhiều máy tính đã bị "mất" unicode, không thể hiển thị đúng font Unicode trên các trang web.

Các hệ thống font Unicode được chia làm 2 loại:

- Unicode đầy đủ, dùng trọn vẹn 2 byte để biểu diễn toàn bộ bảng mã Unicode. Trên các trang web, chúng được khai báo trong cặp thẻ Meta như sau:



- Unicode rút gọn, còn được gọi là Unicode 8 bit, hay UTF - 8. Trên trang web, chúng được khai báo trong cặp thẻ Meta như sau:



Để hiển thị đúng đắn tiếng Việt trên trình duyệt, các hệ thống này cũng phải được encode theo đúng tiêu chuẩn của nó. Đối với hệ thống Unicode đầy đủ, người ta phải encode nó về dạng Western European (Windows). Còn đối với hệ thống font UTF - 8, người ta phải Encode nó về dạng Unicode (UTF-8).

2. Nhận dạng các chủng loại font Unicode:

Nếu các bạn lập trình và đẩy dữ liệu vào database, thì tuỳ theo hệ thống font chữ mà nó có thể có các dạng ký tự khác nhau. Chẳng hạn, với dòng chữ "Nhà tôi trên bến sông, có chiếc cầu nhỏ cong cong như con tôm" như trên, dòng ký tự sẽ có thể có dạng sau:

- Đối với font Unicode đầy đủ: "Nh#224; t#244;i tr#234;n b#7871;n s#244;ng, c#243; chi#7871;c c#7847;u nh#7887; cong cong nh#432; con t#244;m"

- Đối với font UTF - 8: "Nhà tôi trên bến sông, có chiếc cầu nhỏ cong cong nhÆ° con tôm"

Nếu bạn mở một trang web mà thấy một số ký tự ở một trong các dạng trên, các bạn có thể đoán ra trang đó sử dụng hệ thống font chữ gì và tìm cách cài đặt hoặc encode cho hợp lý.

III. Sử dụng font trong các thao tác với CSDL:

Vấn đề then chốt để làm việc với các CSDL đó là định dạng font chữ. Khi nhập một chuỗi vào CSDL, bạn phải xác định được chuỗi đó được mã hoá theo tiêu chuẩn font chữ nào, để khi xuất ra, bạn phải chắc chắn là trang web đó được mã hoá theo tiêu chuẩn tương ứng.

Chẳng hạn, trong một trang web, sử dụng thẻ:



Khi đó, nếu trong trang đó có chứa các phần tử form thì dữ liệu sau khi được submit sẽ được tự động chuyển mã sang dạng Unicode utf-8 tương ứng. Khi bạn lưu vào database, chuỗi sẽ được giữ nguyên định dạng mã hoá của utf-8. Như vậy, nếu bạn muốn xuất chuỗi đã lưu vào CSDL lên trang web, việc đầu tiên, bạn phải có dòng chữ xác định kiểu encode (mã hoá):



Và sau đó, bạn có thể ung dung xuất chuỗi đó ra trang web mà không sợ bị lỗi font (tất nhiên trừ trường hợp font hệ thống của máy tính đó đã bị ghi đè bởi các font khác).

Đối với các hệ thống font chữ khác cũng tương tự như vậy. Chúc các bạn thành công và có được những trang web hay, đẹp và có những nội dung phong phú có ích cho xã hội




Theo PHPVietnam

No comments: