話說前兩天吧,一個項目中因為要通過ajax調用ashx(一般處理常式),並傳遞一連串的參數,這參數裡麵包含了一些中文,其實之前一直在使用,沒發現什麼問題,但是這兩天突然出現中文轉換亂碼,出現這樣的問題完全是由於對標準的不熟悉,至於網上其它人說的修改jquery檔案,使用 escape、encodeURI、encodeURIComponent方法,也許可行,但經我測試並未解決問題,可能環境不同也會造成此問題,在這裡我不表示反對,除了以後所述,我還測試了其它的方法,比如在requert前後更改編碼類別型,採用不序列化的方法等,思考的和測試的時間花了不少,說實話,最近園子裡的氣氛我不太喜歡,不過看到網關關於這問題很少有人在這個角度去分析,所以我還是發首頁了。
1、實際的項目代碼我就不寫了,寫點測試的,效果一樣,以下是javascript代碼。當然應用了JQuery:
1function test() {
2 var content ="{\"Content\":\"*中國人*\"}";
3 $.post("../ashx/Handler1.ashx",
4 {
5 Content: content
6 },
7 function(data) {
8 alert(data);
9 }, "json");
10}
2、後台序列化代碼,應用了.net framework3.5 的新功能 DataContractJsonSerializer(網上資料很多,這類的作用我就不用說了)
1 public void ProcessRequest(HttpContext context)
2 {
3 context.Response.ContentType = "text/plain";
4 string conten = context.Request["Content"];
5 try
6 {
7 DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(News));
8 MemoryStream ms = new MemoryStream(Encoding.GetEncoding("gb2312").GetBytes(conten));
9 News news = (News)dcs.ReadObject(ms);
10 string c = news.Content;
11 }
12 catch (Exception ex)
13 {
14 throw ex;
15 }
16 }
分析:
3、上面的這段代碼註定要拋出一個序列化字串包含無效字元的異常。
4、但是當我在用戶端傳遞的:“中國人”改成“中國人民”後,異常消失。
5、為什麼呢為什麼呢?原因說起來相當的簡單和傻冒,為什麼是奇數字元異常而偶數卻不會?說起來這曆史相當遙遠,卻是由於javascript的編碼造成,或者也可以說是項目的編碼環境造成的,javascript默信採用的"utf-8" ISO 1的編碼,將所有中文字元轉換為3個位元組,而utf-8及gb2312卻是將所有中文字元轉換為2位元組,這一轉手,得,情況突變,3位元組變成2位元組,亂碼隨之而來。
6、其實是因為在項目中應用的是:gb2312編碼,在web.config中更改即可,其實只要更改requesEncoding的編碼即可。
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="gb2312" fileEncoding="gb2312"/>
</system.web>
7、其實在這之前,我檢查了JQuery的編碼應用,它裡面並沒有規定使用什麼樣的編碼,不需要去更改源檔案,這是jquery-1.3.2.js和jquery-1.3.2-vsdoc2.js中的設定。
位於jquery-1.3.2.js中的3362行,當然,我沒有完全剪下出來。
1ajaxSettings: {
2 url: location.href,
3 global: true,
4 type: "GET",
5 contentType: "application/x-www-form-urlencoded",
6 processData: true,
7 async: true
8}