• Thứ Hai, 17/08/2009 10:14 (GMT+7)

    Tại sao không tìm thấy nội dung tiếng Việt trên ASP?

    Câu hỏi :
    Website viết bằng ASP và sử dụng cơ sở dữ liệu SQL2000, gặp vấn đề sau: Khi nhập vào nội dung text dùng font unicode utf-8, hiển thị chính xác; nhưng sau đó trong trang người dùng không tìm được nội dung text do chữ Việt nhập vào đã bị mã hóa. Xin hướng dẫn.

    Trả lời :
    Để các trang HTML và ASP có thể xử lý và hiển thị đúng chuỗi văn bản Unicode tiếng Việt, bạn nên khai báo tham số charset=utf-8 (ở tag <meta> trong trang tương ứng). Để SQL Server xử lý đúng chuỗi Unicode trong các lệnh truy vấn SQL, bạn nên dùng cú pháp N'chuỗi' để miêu tả một chuỗi Unicode. Sau đây là 1 thí dụ về xây dựng Website tra danh bạ điện thoại bằng công nghệ ASP. Website này gồm 3 thành phần: database chứa thông tin các thuê bao điện thoại, trang HTML chứa form nhập liệu và trang ASP để tra danh bạ và hiển thị kết quả.

     1. Bạn chạy tiện ích quản lý database SQL Server, tạo mới database có tên là mydatabase, trong database này bạn tạo 1 bảng dữ liệu có tên là danhbadienthoai, mỗi record gồm 3 field thông tin: tenthuebao, sodienthoai, diachi đều thuộc kiểu dữ liệu ntext (chuỗi Unicode). Thử thêm một số record dữ liệu chứa nội dung chuỗi tiếng Việt Unicode theo nhu cầu vào bảng danhbadienthoai.

     2. Để đơn giản hóa vấn đề, trang HTML chứa form giao diện chỉ chứa 3 textbox txtTenthuebao, txtSodthoai, txtDiachi để người dùng có thể nhập một phần thông tin về thuê bao mà họ muốn tìm kiếm. Bạn dùng trình soạn văn bản NotePad có sẵn trong Windows để viết trang HTML chứa form nhập liệu với nội dung như sau:
     
     <HTML> <HEAD>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <TITLE></TITLE>
     </HEAD>
     <BODY>
     <P align=center><FONT face=Arial size=5>Demo việc tra danh bạ điện thoại hỗ trợ chuỗi tiếng Việt Unicode</FONT></P>
     <P><FONT face=Arial size=3>
     <FORM name=FORM1 action=ASPTraDT.asp method=post>
     Nhập 1 phần tên thuê bao mà bạn biết :&nbsp; <INPUT name=txtTenthuebao style="width: 269px; height: 22px">
     <P>Nhập 1 phần số điện thoại mà bạn biết :&nbsp; <INPUT name=txtSodthoai></P>
     <P>Nhập 1 phần địa chỉ mà bạn biết :&nbsp; <INPUT name=txtDiachi style="width: 373px; height: 22px"></P>
     <P><INPUT type=submit value="Bắt đầu tra"></P></FORM>
     </BODY> </HTML>
     
     Lưu ý khi lưu file HTML hãy đặt tên cho file là ASPInputForm.htm và chọn cách mã hóa utf-8. Khi chạy, Form giao diện trong trang HTML trên sẽ kích hoạt trang ASP có tên là ASPTraDT,asp chạy. Nhiệm vụ của trang ASP là tìm kiếm trong bảng danh bạ điện thoại xem có bao nhiêu record thỏa mãn tiêu chuẩn tìm kiếm, xây dựng và hiển thị một bảng liệt kê các thông tin về các record này.
     3. Bạn có thể dùng trình soạn văn bản NotePad để viết trang ASP với nội dung như sau :
     
     <%@ Language="VBScript" CodePage="65001"%>
     <HTML>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <HEAD>
     <%
     Sub Timkiem()
     dim DBConn
     Dim cmd
     Dim Rs
     'xây dựng lệnh truy vấn theo yêu cầu của người dùng
     fsqlstart = 1
     tentbao = Request.Form("txtTenthuebao")
     sodthoai = Request.Form("txtSodthoai")
     diachi = Request.Form("txtDiachi")
     newSQL="SELECT * FROM danhbadienthoai"
     if tentbao <> "" then
     newSQL = newSQL + " where tenthuebao like N'%" + tentbao + "%'"
     fsqlstart = 0
     end if
     if sodthoai <> "" then
     if fsqlstart = 1 then
     newSQL = newSQL + " where sodienthoai like N'%" + sodthoai + "%'"
     else
     newSQL = newSQL + " and sodtienhoai like N'%" + sodthoai + "%'"
     end if
     fsqlstart = 0
     end if
     if diachi <> "" then
     if fsqlstart = 1 then
     newSQL = newSQL + " where diachi like N'%" + diachi + "%'"
     else
     newSQL = newSQL + " and diachi like N'%" + diachi + "%'"
     end if
     fsqlstart = 0
     end if
     'tạo đối tượng quản lý connection đến database SQL Server
     Set DBConn = Server.CreateObject("ADODB.Connection")
     DBConn.Open("Provider=SQLOLEDB; Persist Security Info=False; SERVER=HIEPCOMP\SQLEXPRESS; UID=sa; PWD=luonghoa; Initial Catalog=mydatabase; Port=1433")
     'tạo đối tượng command để thi hành lệnh SQL
     Set cmd = Server.CreateObject("ADODB.Command")
     cmd.ActiveConnection = DBConn
     cmd.CommandText = newSQL
     'thi hành lệnh SQL tìm kiếm
     Set Rs = cmd.Execute
     nItem = 1
     if Not Rs.EOF then
     'nếu có dữ liệu thì tạo bảng hiển thị thông tin
     Response.Write "<table border=1>" & vbCrLf
     Response.Write "<tr><th>Số thứ tự</th><th>Tên thuê bao</th><th>Số điện thoại</th><th>Địa chỉ</th></tr>" & vbCrLf
     'duyệt hiển thị từng thuê bao trên 1 hàng của bảng
     while Not Rs.EOF
     vTentbao = Rs.Fields("Tenthuebao").Value
     vSodthoai = Rs.Fields("Sodienthoai").Value
     vDiachi = Rs.Fields("Diachi").Value
     Response.Write "<tr><td>" & nItem & "</td><td>" & vtentbao & "</td><td>" & vsodthoai & "</td><td>" & vdiachi & "</td></tr>" & vbCrlf
     nItem = nItem +1
     Rs.MoveNext
     Wend
     Response.Write "</table>" & vbCrlf
     else
     Response.Write "<p>Không tìm được record nào thỏa tiêu chuẩn của bạn!</p>" & vbCrlf
     end if
     'đóng các đối tượng đã dùng
     DBConn.Close
     Rs.Close
     End sub
     %>
     </head>
     <body>
     <h3>Kết quả tìm kiếm của bạn : </h3>
     <% Timkiem %>
     <p>
     <a href="ASPInputForm.htm">Quay về trang chủ </a>
     </p>
     </body>
     </html>
     Lưu ý khi lưu file ASP hãy đặt tên cho file là ASPTraDT.asp và chọn cách mã hóa utf-8
    Chuyên mục: Lập trình