Friday, December 26, 2008

ASP & MS SQL處理UTF-8之亂碼問題

ASP & MS SQL處理UTF-8之亂碼問題

最近幫同事處理UTF-8的問題,原先的問題為:從JSP程式傳UTF-8格式的參數給ASP,ASP的Server端Request JSP來的參數值,會變成亂碼。

解決方法:
**********************************************************************************
' ASP Server端
**********************************************************************************
在ASP開頭第一行必須加上 <% CodePage=65001 %>,讓整頁的ASP以UTF-8格式處理。


**********************************************************************************
' Client端
**********************************************************************************
Client端的HTML必須加上 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">,使HTML的內容以UTF-8格式顯示。


**********************************************************************************
' 參數傳遞
**********************************************************************************
若參數須以URL傳遞時:
VBScript:則參數必須加上 Server.URLEncode(參數值)
EX:xxx.asp?參數=Server.URLEncode(參數值)


JavaScript:則必須用escape包起來
EX:
function queryPublish()
{
var pubInfo = window.showModalDialog('_frame.asp?pubNm=' + escape(document.frm1.pubID.value), 'window', 'dialogWidth=600px;dialogHeight=800px');
}

**********************************************************************************
' SQL
**********************************************************************************
存檔時必須以UTF-8格式存檔,下SQL語法時,每個值前面須加上N

以下為自網路上找到的資訊:
SQL Sever 、UTF8、多語系處理
sql server本身無法直接設定用UTF-8編碼資料庫,不過...

使用SQL Server 存放UTF-8碼作法如下
1.page編碼

...
request.setCharacterEncoding("utf-8");

2.JDBC連接設定
jdbc:jtds:sqlserver://localhost:1433;DatabaseName=testUTF8;SendStringParametersAsUnicode=true
或是官方drivers
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testUTF8;SendStringParametersAsUnicode=true

3. N prefix
The N prefix tells SQL Server to use the Unicode character set to translate the 'SQL Server' string. The N prefix isn't necessary if you use the same code page on all your clients and servers and don't deal with language localization problems. However, Unicode works well if you're not sure whether you're using the same code page on all your clients and server.

sql="insert into test(name) values(N'"+name+"')";

此欄位的型態必須設為nvarchar

No comments: