ASP.NET下QueryString不同字符编码间强制转换的解决方案
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET下QueryString不同字符编码间强制转换的解决方案
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正常的情況下,現(xiàn)在asp.net的網(wǎng)站很多都直接使用UTF8來進(jìn)行頁面編碼的,這與Javascript、缺省網(wǎng)站的編碼是相同的,但是也有相當(dāng)一部分采用GB2312。
???? 對于GB2312的網(wǎng)站如果直接用javascript進(jìn)行ajax數(shù)據(jù)提交,例如:http://www.xxx.com/accept.aspx?name=張三,或者說在UTF8的網(wǎng)站上用以下ASP.net的代碼進(jìn)行提交,也是不行的。
WebRequest?request?=?WebRequest.Create("http://www.xxx.com/accept.aspx?name=張三");
????????request.Method?=?"POST";
????????HttpWebResponse?response?=?(HttpWebResponse)request.GetResponse();
???? 這樣在GB2312編碼的網(wǎng)站下得到Request.QueryString["name"]是亂碼,MS已經(jīng)把編碼轉(zhuǎn)換這塊封裝好了。
???? 在UTF8編碼通訊和GB2312網(wǎng)站通訊方式下的編碼轉(zhuǎn)換方式有很多種實(shí)現(xiàn):
???? 第一種:首先對要傳輸?shù)淖址M(jìn)行UrlEncode,這種編碼后的字符在解碼時(shí)用UTF8編碼方式進(jìn)行手工解碼,這樣保證結(jié)果一致,即使傳輸給的目標(biāo)頁面時(shí)GB2312,結(jié)果都是一樣的,解碼方式如下代碼。
HttpUtility.UrlDecode(s,?Encoding.UTF8); ???? 這樣可以得到正確的張三,這要求在提交的時(shí)候先進(jìn)行HttpUtility.UrlEncode編碼成UTF8先,然后再放到name=(編碼后的字符),這也是目前比較常用和普遍的解決方式,只是缺點(diǎn)有一個(gè)就是要告訴別人你先怎么怎么Url編碼先,然后再怎么怎么。
???? 第二種:比較另類一些,直接讀取客戶端提交的字節(jié)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,之所以Request.QueryString["name"]會是亂碼,是MS根據(jù)當(dāng)前頁面的編碼進(jìn)行轉(zhuǎn)換導(dǎo)致的,例如當(dāng)前頁面編碼是GB2312,而人家提交的是UTF8,你沒用人家提交的UTF8編碼轉(zhuǎn)當(dāng)然是亂碼,并不是人家傳過來就是亂碼。這時(shí)我們需要得到原始數(shù)據(jù)進(jìn)行重新解碼,非常遺憾的是我并沒有找到直接提供頭部原始字節(jié)數(shù)據(jù)方法給我們用,沒關(guān)系,解剖下MS的源代碼,發(fā)現(xiàn)代碼如下:
????????public?NameValueCollection?QueryString?{
????????????get?{?
????????????????if?(_queryString?==?null)?{
????????????????????_queryString?=?new?HttpValueCollection();?
?
????????????????????if?(_wr?!=?null)
????????????????????????FillInQueryStringCollection();?
????????????????????_queryString.MakeReadOnly();
????????????????}
?
????????????????if?(_flags[needToValidateQueryString])?{
????????????????????_flags.Clear(needToValidateQueryString);?
????????????????????ValidateNameValueCollection(_queryString,?"Request.QueryString");?
????????????????}
?
????????????????return?_queryString;
????????????}
????????}
private?void?FillInQueryStringCollection()
{
????byte[]?queryStringBytes?=?this.QueryStringBytes;
????if?(queryStringBytes?!=?null)
????{
????????if?(queryStringBytes.Length?!=?0)
????????{
????????????this._queryString.FillFromEncodedBytes(queryStringBytes,?this.QueryStringEncoding);
????????}
????}
????else?if?(!string.IsNullOrEmpty(this.QueryStringText))
????{
????????this._queryString.FillFromString(this.QueryStringText,?true,?this.QueryStringEncoding);
????}
}
順便說一下,QueryString是在第一次被訪問時(shí)才初始化的,如果你的程序中沒有用到它,那個(gè)這個(gè)對象會一直保持空值,MS考慮了細(xì)節(jié)
???? 大家都看到了QueryStringBytes屬性,原型如下internal byte[] QueryStringBytes,這個(gè)就是原始的QueryString字節(jié)了。出招了:
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); 再看看querystring是什么,哈哈name=張三。
???? 各種編碼的轉(zhuǎn)換都可以自己完成,畢竟得到提交的原始字節(jié)了,希望對大家有所幫助。
???? 對于GB2312的網(wǎng)站如果直接用javascript進(jìn)行ajax數(shù)據(jù)提交,例如:http://www.xxx.com/accept.aspx?name=張三,或者說在UTF8的網(wǎng)站上用以下ASP.net的代碼進(jìn)行提交,也是不行的。
WebRequest?request?=?WebRequest.Create("http://www.xxx.com/accept.aspx?name=張三");
????????request.Method?=?"POST";
????????HttpWebResponse?response?=?(HttpWebResponse)request.GetResponse();
???? 這樣在GB2312編碼的網(wǎng)站下得到Request.QueryString["name"]是亂碼,MS已經(jīng)把編碼轉(zhuǎn)換這塊封裝好了。
???? 在UTF8編碼通訊和GB2312網(wǎng)站通訊方式下的編碼轉(zhuǎn)換方式有很多種實(shí)現(xiàn):
???? 第一種:首先對要傳輸?shù)淖址M(jìn)行UrlEncode,這種編碼后的字符在解碼時(shí)用UTF8編碼方式進(jìn)行手工解碼,這樣保證結(jié)果一致,即使傳輸給的目標(biāo)頁面時(shí)GB2312,結(jié)果都是一樣的,解碼方式如下代碼。
HttpUtility.UrlDecode(s,?Encoding.UTF8); ???? 這樣可以得到正確的張三,這要求在提交的時(shí)候先進(jìn)行HttpUtility.UrlEncode編碼成UTF8先,然后再放到name=(編碼后的字符),這也是目前比較常用和普遍的解決方式,只是缺點(diǎn)有一個(gè)就是要告訴別人你先怎么怎么Url編碼先,然后再怎么怎么。
???? 第二種:比較另類一些,直接讀取客戶端提交的字節(jié)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,之所以Request.QueryString["name"]會是亂碼,是MS根據(jù)當(dāng)前頁面的編碼進(jìn)行轉(zhuǎn)換導(dǎo)致的,例如當(dāng)前頁面編碼是GB2312,而人家提交的是UTF8,你沒用人家提交的UTF8編碼轉(zhuǎn)當(dāng)然是亂碼,并不是人家傳過來就是亂碼。這時(shí)我們需要得到原始數(shù)據(jù)進(jìn)行重新解碼,非常遺憾的是我并沒有找到直接提供頭部原始字節(jié)數(shù)據(jù)方法給我們用,沒關(guān)系,解剖下MS的源代碼,發(fā)現(xiàn)代碼如下:
????????public?NameValueCollection?QueryString?{
????????????get?{?
????????????????if?(_queryString?==?null)?{
????????????????????_queryString?=?new?HttpValueCollection();?
?
????????????????????if?(_wr?!=?null)
????????????????????????FillInQueryStringCollection();?
????????????????????_queryString.MakeReadOnly();
????????????????}
?
????????????????if?(_flags[needToValidateQueryString])?{
????????????????????_flags.Clear(needToValidateQueryString);?
????????????????????ValidateNameValueCollection(_queryString,?"Request.QueryString");?
????????????????}
?
????????????????return?_queryString;
????????????}
????????}
private?void?FillInQueryStringCollection()
{
????byte[]?queryStringBytes?=?this.QueryStringBytes;
????if?(queryStringBytes?!=?null)
????{
????????if?(queryStringBytes.Length?!=?0)
????????{
????????????this._queryString.FillFromEncodedBytes(queryStringBytes,?this.QueryStringEncoding);
????????}
????}
????else?if?(!string.IsNullOrEmpty(this.QueryStringText))
????{
????????this._queryString.FillFromString(this.QueryStringText,?true,?this.QueryStringEncoding);
????}
}
順便說一下,QueryString是在第一次被訪問時(shí)才初始化的,如果你的程序中沒有用到它,那個(gè)這個(gè)對象會一直保持空值,MS考慮了細(xì)節(jié)
???? 大家都看到了QueryStringBytes屬性,原型如下internal byte[] QueryStringBytes,這個(gè)就是原始的QueryString字節(jié)了。出招了:
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); 再看看querystring是什么,哈哈name=張三。
???? 各種編碼的轉(zhuǎn)換都可以自己完成,畢竟得到提交的原始字節(jié)了,希望對大家有所幫助。
轉(zhuǎn)載于:https://www.cnblogs.com/zhujiechang/archive/2009/07/25/1530878.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET下QueryString不同字符编码间强制转换的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript实现平滑的锚点
- 下一篇: Spring.NET教程(二十)——整合