1. 程式人生 > >【工作筆記0010】asp.net後臺Request.QueryString獲取的url中文引數亂碼解決方案

【工作筆記0010】asp.net後臺Request.QueryString獲取的url中文引數亂碼解決方案

通常頁面前端向後臺傳遞引數有兩種方法:

1.表單提交。

採用form標籤,將需要提交的內容放到form標籤裡面,

後臺用string str = Request.Form["標籤名字"].ToString();接收即可。

採用這種方式獲取到的含有中文的字串一般不會出現亂碼的情況,

只需要頁面中設定的字元編碼和後臺配置檔案中設定的字元編碼一致即可。

2.以url形式get或post請求。

這種情況多是用在只需要提交少量資料到後臺驗證或請求資料,但只要url中引數帶有中文,就很可能會出現後臺以Request.QueryString["引數名"].ToString();形式獲取的中文亂碼究其原因就是該url傳到後臺之前會重新編碼,若傳到後臺後沒有按照原來頁面設定的編碼格式解碼回來的話就會出現獲取到的中文引數亂碼


下面給出一個例子來解決這種情況。

例如提交 使用者名稱 到後臺驗證該使用者名稱是否存在,這時可以利用jQuery的ajax函式向後臺提交請求,示例程式碼如下:

前端重要程式碼:

$.ajax({
            type: 'post',
            dataType: 'text',
            url: "/xxxx.aspx?act=test&username=" + encodeURI('這是使用者名稱'),
            success: function(data) {
                if(data == 'y')
                    alert("驗證成功!");
                else
                    alert("驗證失敗!");
            },
            error: function() {
                alert("驗證失敗!");
            }
        });  </span></span>

提示:上述url中act=test表示該行為是驗證使用者名稱,encodeURL函式是將username字串作為 URI 進行編碼,此函式是必需的。

後臺重要程式碼:

Type type = Request.GetType();
PropertyInfo property = type.GetProperty("QueryStringBytes",
BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.NonPublic);
byte[] queryBytes = (byte[])property.GetValue(Request, null);
string queryString = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8);//獲取中文引數採用UTF8編碼就可以了

提示:

上述程式碼目的是將獲取到的請求原始資料重新編碼,以方便獲取到 中文 引數。

最後queryString 中獲取到的字串是 act=test&username=這是使用者名稱,至於提取出username=後面的字串就可以直接用: string note = queryString.Substring(queryString.IndexOf("username=") + 9);此時note為"這是使用者名稱"。

上述程式碼使用前需要先引用一下兩個類庫:

using System.Text;
using System.Reflection;</span></span>

最後,希望看到這篇文章的你能夠成功解決遇到的問題,博主也是最近剛遇到這個問題,所以就寫了這篇博文以記錄一下。上述程式碼均為自己編寫,可直接複製到程式使用,歡迎交流!