日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET下QueryString不同字符编码间强制转换的解决方案

發(fā)布時(shí)間:2023/12/18 asp.net 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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é)了,希望對大家有所幫助。

轉(zhuǎn)載于:https://www.cnblogs.com/zhujiechang/archive/2009/07/25/1530878.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET下QueryString不同字符编码间强制转换的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。