jquery的ajax 寫死是使用utf-8 傳遞數據的,而我的webconfig配置了
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312"/>
(這樣配置的原因是:用戶暱稱中存在很多特殊字符,只有gb2312才能支持)
這樣表示,我丟給jquery的字符,他還是採用了utf-8給我傳去了後臺,後臺的handler拿到的完全是亂碼。
爲了解決這個問題,之前寫過一個
不吹牛的jquery在.net中通過gb2312傳中文的實現
這個主要通過get方式來傳送,從而避免了jquery的編碼,採用頁面的request和response來編碼。
實現倒是可以實現,只是有一個限制:傳遞的中文長度受限,好像是根據瀏覽器的地址欄最大長度,不可以超過256個字的。
那麼有沒有完美的方案呢?
我想到,通過.net類庫提供的Request.Forms,或者Request.QueryString得到的,都是他按照webconfig配置自動編碼、解碼的字符串,完全都不受我控制。那我是否可以從更底層獲取到byte數組,自己解碼呢?
最後找到Request.BinaryRead方法。
首先還是通過jquery的Ajax方法將中文傳過來,這個時候,得到的是utf8編碼的(由jquery編碼)。
在後臺:
byte[] bys = context.Request.BinaryRead(context.Request.ContentLength);
string theStr = HttpUtility.UrlDecode(bys, Encoding.UTF8);
NameValueCollection pars = HttpUtility.ParseQueryString(theStr, Encoding.UTF8);
在前臺:
jQuery.post(url,
{MyType:"hompy.index.addLeaveMessage", hidden:hidden,ouid:g_commentouid,content:content,type:g_commenttype}
, function (req) { addCommentShow(req, v_btn, v_prompt); });