1
LP TRÌNH WEB ASP VI TING VIT UNICODE
Đình Duy
Khoa CNTT - ĐHKHTN Tp. HCM
ldduy@fit.hcmuns.edu.vn
08.2002
1. Mt s khái nim căn bn v biu din kí t bên trong máy tính
1.1. Khái nim v đim mã, đơn v mã, bng mã
V mt bn cht, máy tính ch làm vic vi các con s, do đó để biu din các kí t trên máy tính cn phi
có mt qui ước nht quán gia các kí t cn biu din và các con s tương ng mày tính x lí. Qui ước
này được th hin qua các bước sau:
- Chn tp các kí t cn mã hóa (character set).
- Gán cho mi kí t cn mã hóa mt giá tr nguyên không âm, gi là đim mã (code point).
- Chuyn các đim mã thành dãy các đơn v mã (code units) để cho phc v cho vic lưu tr và mã
hóa. Mt đơn v mã là mt đơn v ca b nh, có th là 8, 16, hay 32 bit. Các đim mã không nht
thiết phi có cùng s đơn v mã.
Tp hp nhng đim mã ca mt tp các kí t được gi là mt trang mã (code page) hay còn gi là bng
mã hay b. Như vy khi nói v mt bng mã, chúng ta quan tâm đến hai điu chính, s lượng các kí t
được mã hóa, và cách mã hóa chúng thành các đơn v mã.
Ly ví d bng mã ASCII, tp kí t cn mã hóa có 128 kí t bao gm các kí t tiếng Anh, kí t s, kí t tin
t Anh, M và các kí t điu khin h thng ngoi vi. Các đim mã có giá tr nm trong khong t 0-127. Mi
đim mã được mã hóa bng đúng mt đơn v mã 8 bit, có nghĩa là đúng mt byte.
Vic quyết định chn cách mã hóa như thế nào s quyết định s lượng kí t được mã hóa. Ví d, nếu chn
cách mã hóa các đim mã bng đúng mt đơn v mã 8-bit thì s lượng đim mã ca mt bng mã (tm gi
là bng mã 8 bit) ch có th ti đa là 256.
Do bng mã ASCII không đủ để biu din các kí t ca các ngôn ng khác, ví d như tiếng Vit, nên
Microsoft đã ni rng bng mã ASCII bng cách s dng 128 đim mã có giá tr t 128-255 để mã hóa cho
các kí t ngoài ASCII này. Tuy nhiên do ch có 128 đim mã, trong khi s lượng các kí t ca các ngôn ng
khác nhiu hơn, nên Microsoft đã to ra nhiu bng mã khác nhau cho tng loi ngôn ng [1]. Ví d:
code page 1250 1251 1252 1253 1254 1258 etc.,
upper
128
Eastern Europe Cyrillic West Euro
ANSI
Greek Turkish Vietnamese etc.,
lower
128
ASCII ASCII ASCII ASCII ASCII ASCII etc.,
Tuy nhiên trong tng bng mã này, không phi tt c các kí t ca mt ngôn ng đều có trong bng mã.
Hay nói chính xác hơn là không phi tt c các kí t đều được biu din bng duy nht mt đim mã. Ly ví
d tiếng Vit chúng ta có 134 kí t t hp t 28 ch cái và 5 du thanh. Do ch có 128 đim mã nên bng
mã windows-1258 dành cho tiếng Vit biu din mt s kí t thành hai đim mã liên tiếp, mt đim mã dành
cho kí t cơ s và mt đim mã dành cho du thanh. Ví d: kí tế được biu din bng hai đim mã
2
tương ng vi các kí t ê và kí t du sc: ế = ê + . Cách biu din như vy được gi là cách biu din
tách ri (decomposed) mà thut ng chúng ta hay gi là t hp.
Bng mã TCVN3-ABC dùng 134 đim mã để biu din hết các kí t tiếng Vit, chính điu này đã dn đến
phi s dng mt s đim mã ca bng mã ASCII. Đây chính là lí do mà các trang web s dng bng mã
này không hin th được kí t ư trong các trình duyt Internet Explorer 5.0 tr lên. Cách biu din như vy
được gi là cách biu din kết hp sn (precomposed) mà thut ng chúng ta hay gi là dng sn.
1.2. Bng mã Unicode
V mt bn cht các bng mã trên ca Windows là bng mã 8-bit, nghĩa là mi đim mã được mã hóa bng
đúng mt đơn v mã 8-bit. Chính điu này đã gii hn s lượng các các kí t được mã ch là 256. Do đó
trong mt văn bn không thng hin th nhiu kí t ca các ngôn ng khác nhau được.
Unicode ra đời nhm thng nht chung các kí t ca mi ngôn ng trong mt bng mã duy nht [2]. Hai vn
đề nên lưu ý khi đề cp đến thut ng Unicode đó là:
- Tp kí t mà Unicode biu din: đây mun nói đến tp kí t và cách ánh x các kí t bng các
đim mã tương ng.
- Cách mã hóa các đim mã thành các đơn v mã.
Unicode dùng 16 bit để biu din các đim mã, do đó nó có th biu din được đến 65,536 kí tđim mã
nm trong khong t 0-65,535. Do vy vi Unicode người ta có th biu din được hu hết các kí t ca
các ngôn ng.
Cách đơn gin nht để mã hóa các kí t Unicode là biu din mi đim mã bng đúng mt đơn v mã 16-bit.
Đây chính là cách mã hóa nguyên thy ca Unicode trong phiên bn 2.0 được ISO/IEC chun hóa thành
ISO/IEC 10646 hay còn gi là UCS-2. Tuy nhiên, để tương thích vi các h thng x lí trước khi Unicode ra
đời cũng như ti ưu hóa trong quá trình lưu tr và truyn d liu, người ta dùng các cách khác nhau để
hóa các đim mã thành các đơn v mã. Mi cách mã hóa như vy được gi là mt dng biến đổi ca
Unicode (UTF – Unicode Transformation Format). Thông dng nht hin nay là UTF-8 và UTF-16 dùng dãy
các đơn v mã có độ dài khác nhau để mã hóa các đim mã. UTF-8 dùng 1 đến 4 đơn v mã 8-bit trong khi
UTF-16 dùng 1 đến 2 đơn v mã 16-bit để mã hóa. Ví d sau minh ha cách mã hóa ca UTF-8:
- 128 kí t đầu tiên ca Unicode t đim mã U+0000 đến U+007F, được mã hóa thành 1 byte.
- T đim mã U+0080 đến U+07FF, được mã hóa thành 2 byte.
- T đim mã U+0800 đến U+FFFF, được mã hóa thành 3 byte.
- T đim mã U+0800 đến U+FFFF, được mã hóa thành 4 byte.
Như vy khi đề cp đến Unicode trong lp trình, cn phi xác định rõ chúng ta dùng bng mã Unicode theo
dng biến đổi nào: UCS-2, UTF-8, hay UTF-16, … UCS-2 được dùng trong các h qun tr cơ s d liu
như SQL Server 7.0/2000, Microsoft Access 2000, UTF-8 thường được dùng trong các ng dng web, trong
khi UTF-16 li được dùng trong các h thng như Windows 2000/XP, Java, …
2. Lp trình web vi tiếng Vit Unicode
2.1. Ch định bng mã dùng trong trang web
Khi mt trang web được server chuyn xung cho client, trình duyt s dùng thông tin v bng mã mà trang
web đó s dng để chuyn dãy các byte trong tài liu đó thành các kí t tương ng để hin th lên màn
hình. Ngoài ra, mt khi d liu trong các FORM được gi đi sau khi người dùng submit, trình duyt cũng s
căn c vào bng mã này để chuyn đổi d liu khi truyn đi. Ví d, nếu trang web được ch định dùng bng
3
mã windows-1252 thì khi FORM được submit, d liu s được mã hóa theo bng mã này cho dù trước đó
trong các hp điu khin ca FORM, d liu đưc gõ dưới dng Unicode [3].
Vic ch định bng mã có vai trò rt quan trng trong vic hin th đúng ni dung mà người thiết kế mong
mun, bi vì nếu không ch định bng mã được dùng trong trang web hin hành mt cách rõ ràng, trình
duyt s s dng bng mã mc định. Ví d, nếu d liu chuyn đến cho trang web là E1 BB 81, nếu ch
định bng mã là UTF-8 thì 3 byte này chính là biu din mã ca kí t” trong khi nếu h thng dùng bng
mã mc định, ví d như windows-1252, thì 3 byte này li đưc xem như là biu din 3 kí t khác nhau và s
được hin th là “á»”.
Để ch định bng mã mà trang web hin hành s dng, ta dùng tag META vi thuc tính HTTP-EQUIV được
gán là Content-Type, và ch định tên ca bng mã được dùng trong thuc tính CONTENT (Thông tin v các
bng mã được dùng trên Windows có th xem ti [4]). Trong ví d sau, tag META được dùng để ch định
bng mã windows-1252 cho mt trang web:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=windows-1252">
Để yêu cu trình duyt s dng mt bng mã cho toàn b trang web, ta phi đặt tag META này trước tag
BODY. Thông thường là đặt tag META này trong tag HEAD như ví d sau:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=windows-1252">
<TITLE>New Page 1</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
Trong trường hp bng mã được ch định không có kh năng biu din được tt c các kí t ca trang web,
người ta phi dùng đến s tham chiếu ca kí t (NCRs - numerical character references). S tham chiếu kí
tđim mã ca kí t Unicode tương ng mà nó biu din. S tham chiếu kí t có hai dng thp phân và
thp lc phân. Dng thp phân có cú pháp là “&#D;”, vi D là s thp phân. Dng thp lc phân có cú pháp
là “&#xH;”, vi H là s thp lc phân. Ví d: &#229; và &#xE5; là các s tham chiếu ca kí t “a” trong bng
mã Unicode. Mt khi gp s tham chiếu ca kí t, trình duyt s tham chiếu trc tiếp đến kí tđim mã
tương ng trong bng mã Unicode mà không s dng đến bng mã được ch định hin hành [5].
Ly ví d mt trang web được mã hóa vi bng mã windows-1252, lúc đó để hin th đon văn bn: “Tiếng
Vit”, d liu cho trang web phi là “Ti&#7871;ng Vi&#7879;t” , trong đó &#7871; và &#7879; ln lượt là các
s tham chiếu ca các kí tế” và “” trong bng mã Unicode.
Điu này cho phép gii thích ti sao, các trang web không dùng bng mã UTF-8, ví d như windows-1252,
vn có th hin th được các kí t Unicode không thuc bng mã đó hay khi chuyn đổi t bng mã UTF-8
sang windows-1252, MS FrontPage 2000 li t động thêm vào các s tham chiếu kí t theo cách trên.
2.2. Hot động ca webserver
Khi trình duyt yêu cu mt trang .asp, trình x lí trang asp ti webserver s thông dch các mã lnh trong
trang web này và gi kết qu v cho trình duyt. Thông thường, lnh Response.Write được dùng cho các
kết xut t các hng chui hay t các biến ra màn hình. Ví d như:
4
<%
Response.Write “Chào mng bn đến vi trang web này” ‘in mt hng chui
Response.Write rs(”TEN_NV”) ‘in d liu ca mt biến, ví d như là mt trường ca recordset
%>
Để yêu cu webserver mã hóa các d liu trong các hng chui và biến theo bng mã s được dùng để
hin th ti client, ta cn phi đặt thuc tính CodePage v bng mã tương ng. Các lnh trong ví d sau s
yêu cu webserver mã hóa các chui d liu theo bng mã UTF-8 (Thông tin v các codepage tương ng
vi các bng mã xem ti [4]):
<%Session.CodePage=65001%> // Dùng cho toàn b các trang trong Session hin hành
<%@CodePage=65001%> // Dùng cho trang hin hành
Ly ví d trong trường hp dùng cơ s d liu SQL Server 7.0, d liu được tr v t các câu truy vn theo
bng mã UCS-2. Nếu ta ch định CodePage là 65001, webserver s t động chuyn d liu t UCS-2 sang
UTF-8, ngược li nếu không ch định thuc tính CodePage, webserver s chuyn d liu đó đến client theo
bng mã mc định (ví d như windows-1252). Điu này gii thích cho trường hp mt s trang web asp hin
th không đúng d liu Unicode được lưu trong các cơ s d liu như SQL Server 7.0/2000, MS Access
2000.
Ngoài ra, các trang asp có s dng đon mã lnh thiết lp CodePage là 65001 phi được lưu theo định
dng tương ng là UTF-8 [6].
Như vy, vic thiết lp thuc tính CodePage trong trang asp s giúp cho webserver hiu được các d liu
được lưu trong các cơ s d liu, hng chui kí t, … theo bng mã nào để mã hóa (encode) nó trước khi
chuyn đến cho trình duyt. Vic ch định bng mã dùng trong trang web bng tag META s giúp cho trình
duyt din dch (decode) d liu được chuyn đến t webserver đúng nht khi hin th [7].
2.3. Các bước cơ bn ca lp trình web asp s dng tiếng Vit Unicode
- Son và lưu tr tp tin .asp dưới dng mã hóa UTF-8.
- Trong các tp tin asp, chèn các đon mã ch định cho web server và trình duyt x lí d liu trong
trang web như là UTF-8. Các đon mã này phi đặt đầu trang asp. S dng ví d mu sau:
<%@CODEPAGE=65001%>
<%Session.Codepage=65001%>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
</HEAD>
<BODY>
</BODY>
</HTML>
- S dng các h qun tr CSDL h tr Unicode như SQLServer 7.0/2000, MS Access 2000. Nếu
dùng SQL Server thì phi khai báo kiu d liu cho các trường lưu d liu Unicode là NCHAR,
NVARCHAR, NTEXT, … Các kiu d liu như TEXT, MEMO, HYPERLINK trong MS Access 2000
mc định là h tr lưu d liu Unicode.
- Truy xut cơ s d liu thông qua JScript/VBScript/ODBC.
- Khi làm vic trên h qun tr CSDL SQL Server 7.0/2000, nếu dùng các hng chui trong các câu
lnh SQL, phi thêm tiếp đầu ng N (bt buc là ch in hoa) vào [8]. Nếu không s dng tiếp đầu
5
ng này, SQL Server s t động chuyn chui d liu sang bng mã mc định hin hành trước khi
s dng nó trong các thao tác cp nht CSDL. Ví d, nếu bn dùng câu lnh sau: INSERT INTO
SINHVIEN(TEN_SV) VALUES(‘Trn Nam Hi’) thì hng chui d liu ‘Trn Nam Hi’ s được SQL
Server xem như là chui kí t thường ch không phi là chui Unicode. Điu này s dn đến hu
qu là d liu s được lưu tr không chính xác. Ví d như d liu ca kí t” trong chui trên là
E1 BA A7, s được lưu thành 3 kí t khác nhau. Trong khi đó nếu dùng câu lnh INSERT INTO
SINHVIEN(TEN_SV) VALUES(N‘Trn Nam Hi’) thì 3 byte E1 BA A7 s được xem như là mt kí t
khi lưu xung [9].
3. H tr Unicode ca các phn mm
3.1. Các phn mm h tr son tho trang web
- Visual Studio.NET, Notepad, MS FrontPage2002: H tr lưu tp tin dưới dng UTF-8
- Visual InterDev 6.0: Nếu trong trang asp ta s dng các hng chui được gõ vào dưới dng
Unicode, ví d như: Response.Write “Chào mng bn “ thì lúc lưu tp tin, chương trình s phát hin
ra trong trang asp này có xut hin kí t Unicode và yêu cu lưu xung dưới dng Unicode, nếu
không các kí t Unicode s b mt. Tuy nhiên, nếu chn lưu dưới dng Unicode thì chương trình s
lưu tp tin này dưới dng mã hóa UCS-2. Hin nay webserver IIS không th xđược trang asp
này [10]. Do đó không nên dùng Visual InterDev 6.0 để son tho các trang asp trong các ng dng
Unicode tiếng Vit.
- Các phn mm thông dng h tr gõ tiếng Vit Unicode: UniKey, VietKey.
3.2. Các phn mm h thng khác
- SQL Server 7.0/2000 và MS Access 2000 h tr Unicode. Vi mi kí t Unicode, h thng s s
dng bng mã UCS-2 để lưu tr, nghĩa là dùng c định 2 byte cho mt kí t. SQL 6.5 và MS Access
97 không h tr Unicode.
- IIS 5.0 không th đọc được các tp tin lưu dưới dng UCS-2 [10], không h tr CodePage ca bng
mã UTF-16 là 1200 [11]. IIS 4.0 không h tr CodePage ca bng mã UTF-8 là 65001 [11].
Tóm li
Unicode ra đời nhm khc phc hn chế v s lượng kí t được mã hóa ca các bng mã 8-bit trước đó,
cho phép mi ngôn ng có th s dng chung mt bng mã duy nht. Do vn đề tương thích trong lưu tr
và truyn d liu mà Unicode có các dng mã hóa khác nhau như UCS-2, UTF-8, UTF-16. UTF-8 là dng
mã hóa Unicode thông dng nht trong các ng dng web hin nay.
Để viết các ng dng web dùng tiếng Vit Unicode, cn chn các phn mm son tho h tr lưu tr tp tin
dưới dng mã hóa UTF-8 như Visual Studio.NET, MS FrontPage2000, NotePad, … ; s dng các h qun
tr CSDL h tr Unicode như SQL Server 7.0/2000, MS Access 2000, …; đặt các đon mã ch định bng mã
mà webserver và trình duyt dùng để mã hóa và gii mã d liu.
Tài liu trích dn
1. http://www.microsoft.com/globaldev/articles/unicode.asp
2. http://www.unicode.org/unicode/standard/principles.html
3. http://support.microsoft.com/default.aspx?scid=kb;en-us;Q303612
4. http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/charsets/charset4.asp
5. http://www.w3.org/TR/html401/charset.html#code-position