不過, Big5 能顯示的字集畢竟沒 UTF-8 多. 所以, 若要讓網頁可顯示更多的字(簡體中文, 日文等), UTF-8 編碼是不錯的選擇.
以下分別就資料庫, 前端網頁, 後端程式三個部分, 說明若要讓網頁顯示 UTF-8 編碼, 有哪些地方需要調整.
- 資料庫表格中的欄位資料型態:
將可能存放中文字的資料欄位, 其資料類型從 char, varchar 和 text 改為使用 nchar, nvarchar 和 ntext.
例如下圖的資料表結構: (UserName 和 UserTitle 會存 UTF-8 的資料, 所以設定為 nvarchar(50))
參考資料: http://technet.microsoft.com/zh-tw/library/ms191200(SQL.90).aspx - 前端網頁的部分:
- 修改 <head> 中的 <meta>:
目的: 指示使用者端的瀏覽器使用 UTF-8 的編碼, 瀏覽此網頁.
做法: 在網頁檔的 <head> 中加入 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
(如果原本就有此標籤,只要注意 charset 是 utf-8.) - 修改網頁檔的編碼方式:
目的: 由於上一步已經指示使用者端瀏覽器, 使用 UTF-8 編碼的方式顯示網頁, 相對地, 網頁本身的內容也要以 UTF-8 編碼的方式儲存. (避免網頁中寫死的文字亂碼.)
做法: 利用記事本的另存新檔, 進行網頁檔的編碼確認(如下圖).
(如果發現是 ANSI 或其他非 UTF-8 編碼的選項, 就在編碼的清單中選 UTF-8, 然後覆蓋此檔案.)
- 修改 <head> 中的 <meta>:
- ASP 程式碼的部分: 分為輸出至網頁和寫入資料庫兩部分
- 輸出至網頁的部分:
目的: 在輸出的部分, 設定 UTF-8 的輸出.
做法: 在程式碼第一行 (或是輸出前), 加入以下兩行:(寫入資料庫前也要有上述這兩行.)12Response.CodePage = 65001
Response.CharSet =
"utf-8"
參考資料: http://msdn.microsoft.com/en-us/library/ms524628.aspx - 寫入資料庫的部分:
目的: 寫入 UTF-8 編碼的資料進資料庫.
做法: 利用 ADO 的 Command 進行寫入的作業, 不要用兜字串的方式組合 SQL 句, 進行資料庫的寫入.
一來可避免 SQL Injection 的攻擊, 二來能寫入 UTF-8 的資料.
以下的 Code 是用來寫入一筆資料到使用者表格 (tblUser):
網頁檔 (addUser.htm):程式檔 (addUser.asp):12345678910111213141516<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=utf-8"
/>
<
title
>新增使用者</
title
>
</
head
>
<
body
>
<
div
style
=
"text-align:center"
>
<
form
action
=
"addUser.asp"
method
=
"POST"
>
帳號:<
input
name
=
"txtUserAccount"
/><
br
/>
姓名:<
input
name
=
"txtUserName"
/><
br
/>
職稱:<
input
name
=
"txtUserTitle"
/><
br
/>
<
input
type
=
"submit"
value
=
"送出"
/>
</
form
>
</
div
>
</
body
>
</
html
>
參考資料: http://www.w3schools.com/ado/ado_ref_command.asp123456789101112131415161718192021<%
dim conn,rs,cmd
set conn=Server.CreateObject(
"ADODB.Connection"
)
set rs=Server.CreateObject(
"ADODB.Recordset"
)
set cmd=Server.CreateObject(
"ADODB.Command"
)
conn.Open
"driver={SQL Server};database=Test;server=.;uid=sa;pwd=12345678"
'設定編碼
Response.CodePage = 65001
Response.CharSet =
"utf-8"
With
cmd
.ActiveConnection = conn
.CommandType = 1
.NamedParameters = true
.CommandText =
"INSERT INTO tblUser(UserAccount,UserName,UserTitle) VALUES (?,?,?);"
.Parameters.item(0)= .CreateParameter(
"UserAccount"
,200,1,,Trim(
""
& request(
"txtUserAccount"
)))
.Parameters.item(1)= .CreateParameter(
"UserName"
,200,1,,Trim(
""
& request(
"txtUserName"
)))
.Parameters.item(2)= .CreateParameter(
"UserTitle"
,200,1,2,Trim(
""
& request(
"txtUserTitle"
)))
.Execute
End
With
conn.Close
%>
- 輸出至網頁的部分:
例如以下的程式:
1 2 | strURL = "queryUser.asp?name=" + encodeURIComponent(document.form1.txtUserName.value); |
補充兩種 ADO 的查詢方式: 2009/4/24
- 使用 ADODB.Command 的 Execute: http://www.w3schools.com/ado/met_comm_execute.asp
注意: 用此方式所產生的 ADODB.Recordset, RecordCount 屬性值會是 –1.12345678910111213141516171819<%
dim conn,rs,cmd
set conn=Server.CreateObject(
"ADODB.Connection"
)
set rs=Server.CreateObject(
"ADODB.Recordset"
)
set cmd=Server.CreateObject(
"ADODB.Command"
)
conn.Open
"driver={SQL Server};database=Test;server=.;uid=sa;pwd=12345678"
'設定編碼
Response.CodePage = 65001
Response.CharSet =
"utf-8"
With
cmd
.ActiveConnection = conn
.CommandType = 1
.NamedParameters = true
.CommandText =
"SELECT UserAccount,UserName,UserTitle FROM tblUser WHERE UserName Like ?;"
.Parameters.item(0) = .CreateParameter(
"UserName"
,200,1,,
"%"
& Trim(
""
& request(
"txtUserName"
)) &
"%"
)
'查詢結果
Set
rs = .Execute
End
With
%>
- 使用 ADODB.Recordset 的 Open: http://www.w3schools.com/ado/met_rs_open.asp
注意: 可正確取得RecordCount屬性值, 若要做分頁或計算取到的資料數, 要用此方式.1234567891011121314151617181920<%
dim conn,rs,cmd
set conn=Server.CreateObject(
"ADODB.Connection"
)
set rs=Server.CreateObject(
"ADODB.Recordset"
)
set cmd=Server.CreateObject(
"ADODB.Command"
)
conn.Open
"driver={SQL Server};database=Test;server=.;uid=sa;pwd=12345678"
'設定編碼
Response.CodePage = 65001
Response.CharSet =
"utf-8"
With
cmd
.ActiveConnection = conn
.CommandType = 1
.NamedParameters = true
.CommandText =
"SELECT UserAccount,UserName,UserTitle FROM tblUser WHERE UserName Like ?;"
.Parameters.item(0) = .CreateParameter(
"UserName"
,200,1,,
"%"
& Trim(
""
& request(
"txtUserName"
)) &
"%"
)
End
With
'查詢結果(注意第二個參數放空,不用給conn)
rs.open cmd,,3,2
%>
沒有留言:
張貼留言