1. 程式人生 > >Javascript與ASP.NET(一般處理程式)關於URL(get方式)傳遞中文亂碼問題的解決方案

Javascript與ASP.NET(一般處理程式)關於URL(get方式)傳遞中文亂碼問題的解決方案

一、首先,說一下我要實現的功能

根據老師ID、學年、學期,查詢該教師教授的課程資訊。

二、傳遞引數我遇到的問題:

    我通過傳遞教師ID、學年和學期從資料庫查詢出該教師所教的課程資訊,展現在介面上,從資料庫我能查詢出資料,為什麼在介面不出資料呢,我斷點除錯,發現這樣一個現象。我在js中傳遞的引數,在一般處理程式中獲取時,是這樣顯示的:

    於是有了這篇文章的誕生,通過對此問題的搜尋,讓我瞭解了編碼解碼的一些基本知識。

    在實際的開發中,我們在頁面和頁面之間進行資料傳遞的時候,有時我們會選擇Get方式傳遞引數,例如:

url: "../handler/QueryCourseByTeacher.ashx?TeacherID=" + teacherID.value + "&SchoolYear=" +getschyearvalue + "&Semester=" + getsemestervalue + "&t=" + new Date().getTime(),
     這是用js傳遞引數給一般處理程式頁面,然後將傳遞的引數作為引數,在資料庫進行查詢相關資料,其中getschyearvalue與getsemestervalue為中文引數,當我們使用這種方式去查詢資料的時候,就會出現我上圖中的亂碼問題,因為我們需要注意的是:凡是通過get方式進行URL傳遞中文引數一定要進行URL編碼

三、瞭解一下百科中對URL編碼的解釋

什麼是URL編碼
     url編碼是一種瀏覽器用來打包表單輸入的格式。瀏覽器從表單中獲取所有的name和其中的值 ,將它們以name/value引數編碼(移去那些不能傳送的字元,將資料排行等等)作為URL的一部分或者分離地發給
伺服器
。不管哪種情況,在伺服器端的表單輸入格式樣子象這樣:
    theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes
URL編碼遵守的規則
    每對name/value由&;符分開;每對來自表單的name/value由=符分開。如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值。任何特殊的字元(就是那些不是簡單的七位ASCII,如漢字)將以百分符%用十六進位制編碼,當然也包括象 =,&;,和 % 這些特殊的字元。其實url編碼就是一個字元ascii碼的十六進位制。不過稍微有些變動,需要在前面加上“%”。
比如
“\”,它的ascii碼是92,92的十六進位制是5c,所以“\”的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:“胡”的ascii碼是-17670,十六進位制是BAFA,url編碼是“%BA%FA”。

四、如何解決URL中文引數傳遞編碼問題?

    1、首先,js中,進行URL編碼(使用escape)

url: "../handler/QueryCourseByTeacher.ashx?TeacherID=" + teacherID.value + "&SchoolYear=" + escape(getschyearvalue) + "&Semester=" + escape(getsemestervalue) + "&t=" + new Date().getTime(),

    2、一般處理程式或.ASPX接收頁面進行接收引數並解碼,使用(context.Server.UrlDecode):

        //學年
        string strSchoolYear = context.Server.UrlDecode(context.Request.QueryString["SchoolYear"]);
        //學期
        string strSemester = context.Server.UrlDecode(context.Request.QueryString["Semester"]);


       這樣傳遞中文就不會出現亂碼問題了。