從我的組件中企圖向服務器端的asp頁面發送一個QueryString,它的值為郵件的URL。希望ASP頁面接收之后,直接將該字符串交給Exchange的OWA。
由于OWA只認UTF8編碼的URL字符串,所以我們希望組件里用MSxml2::Serverxmlhttp將這個郵件URL的UTF8編碼字符串發送至服務器的ASP頁面。然后ASP頁面接收之后,也就不用轉碼,直接交給OWA即可。
但是這么做,在ASP頁面中一開始拿到的字符串就是亂碼,原來的“收件箱”的UTF8碼是“%E6%94%B6%E4%BB%B6%E7%AE%B1”,IIS接收時卻是“鏀朵歡綆”!
于是在組件中直接發送漢字的“收件箱”,但是IIS接收時依然是“鏀朵歡綆”!
<%@ Language=vbScript%> <% DataToSend = "%E6%94%B6%E4%BB%B6%E7%AE%B1" ' 收件箱的UTF8編碼 DataToSend = "id=" %26amp; DataToSend Dim xmlhttp Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP") ‘ 這相當于提交一個Form,具體可參見微軟文檔: ‘ HOWTO Submit Form Data by Using XMLHTTP or ServerXMLHTTP Object (Q290591) xmlhttp.Open "POST","http://localhost/tester/Receiver.asp",false xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" xmlhttp.send DataToSend Response.ContentType = "text/xml" Response.Write xmlhttp.responseXMl.xml Set xmlhttp = nothing %> |
用網絡探測器跟蹤表明,假如SXH對象傳遞中文字符,一定會被它事先轉為UTF8編碼的字符串,然后再發給對方服務器。這個是差不多可以確定的。
要害是,IIS接到這個UTF8編碼后,是如何處理的?
我們作了以下試驗:
測試 序號 | Client | Server | |
客戶端提交的Form的字符串 | ASP頁面通過Request.Form(“id”)得到的字符串 | 用Server.URLEncode(value)轉碼之后的結果 | |
1 | %E6%94%B6%E4%BB%B6%E7%AE%B1 (收件箱的UTF8編碼) | 鏀朵歡綆 | %E6%94%B6%E4%BB%B6%E7%AE (缺少了最后的”%B1”) |
2 | 收件箱 | 鏀朵歡綆 | %E6%94%B6%E4%BB%B6%E7%AE (缺少了最后的”%B1”) |
3 | %E8%8D%89%E7%A8%BF (草稿的UTF8編碼) | 鑽夌 | %E8%8D%89%E7%A8%BF (這回是正確的編碼了) |
4 | %CA%D5%BC%FE%CF%E4 (收件箱的Unicode編碼) | 收件箱 | %CA%D5%BC%FE%CF%E4 (還是正確的Unicode編碼) |
5 | %E5%B7%B2%E5%88%A0%E9%99%A4%E9%82%AE%E4%BB%B6 (已刪除郵件的UTF8編碼) | 宸插垹闄偖浠 | %E5%B7%B2%E5%88%A0%E9%99%A4%E9%82%AE%E4%BB (缺少了最后的”%B6”) |
6 | %25E6%2594%25B6%25E4%25BB %25B6%25E7%25AE%25B1 (就是將收件箱的UTF8編碼再用 Server.URLEncode()轉一遍碼) | %E6%94%B6%E4%BB%B6%E7%AE%B1 (這就是正確的收件箱的UTF8編碼,直接扔給OWA即可) | %25E6%2594%25B6%25E4%25BB%25B6%25E7%25AE%25B1 |
對于試驗1和2,IIS接收之前是UTF8編碼,但是注重是奇數個字符!
UTF8編碼實際上是真實內存中字符串存放的數據的明碼,%號相當于只是一個分割符,E是高8位,6是低8位(?)。
IIS接收之后,就會將其轉換為Unicode編碼,但不是明碼,所以%號不見了,由于這時的UTF8編碼是奇數個字符,IIS就錯誤地將其最后一個字符“%B1”截去。
假如拿這個”鏀朵歡綆”放在XML中,讓IE解釋的話,就會顯示為“收件?”。這說明”鏀朵歡綆”確實是正確的Unicode字符串,只是”箱”漢字少了一個字符。
對于試驗3,”草稿”的UTF8編碼是偶數個字符,所以IIS就能夠正確地轉碼,這個“鑽夌”實際上就是”草稿”的Unicode編碼格式。
對于試驗4,你傳給IIS的已經是Unicode編碼了,所以它會自動將其再轉換為Ansi編碼,這樣就是正常的”收件箱”了。
對于試驗6,將中文字符的UTF8編碼再進行一次UTF8轉碼!將這個結果傳給IIS,IIS接到之后,可能只是將%25簡單地轉義為%號,然后就不管了。于是這就是正確的UTF8編碼了。
|
新聞熱點
疑難解答