ASP.NET QueryString乱码解决问题

正常的情况下,现在asp.net的网站很多都直接使用UTF8来进行页面编码的,这与Javascript、缺省网站的编码是相同的,但是也有相当一部分采用GB2312。

对于GB2312的网站如果直接用javascript进行ajax数据提交,例如:http://www.xxx.com/accept.aspx?name=张三,或者说在UTF8的网站上用以下asp.net的代码进行提交,也是不行的,会导致querystring乱码。

WebRequest request = WebRequest.Create("http://www.xxx.com/accept.aspx?name=张三");

request.Method = "POST";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

这样在GB2312编码的网站下得到Request.QueryString["name"]是乱码,MS已经把编码转换这块封装好了。

在UTF8编码通讯和GB2312网站通讯方式下的编码转换方式有很多种实现:

第一种:首先对要传输的字符进行UrlEncode,这种编码后的字符在解码时用UTF8编码方式进行手工解码,这样保证结果一致,即使传输给的目标页面时GB2312,结果都是一样的,避免了querystring乱码。解码方式如下代码。

HttpUtility.UrlDecode(s, Encoding.UTF8);

这样可以得到正确的张三,这要求在提交的时候先进行HttpUtility.UrlEncode编码成UTF8先,然后再放到name=(编码后的字符),这也是目前比较常用和普遍的解决方式,只是缺点有一个就是要告诉别人你先怎么怎么Url编码先,然后再怎么怎么。

第二种:比较另类一些,直接读取客户端提交的字节数据进行转换,之所以Request.QueryString["name"]会是乱码,是MS根据当前页面的编码进行转换导致的,例如当前页面编码是GB2312,而人家提交的是UTF8,你没用人家提交的UTF8编码转当然是乱码,并不是人家传过来就是乱码。这时我们需要得到原始数据进行重新解码来避免querystring乱码,非常遗憾的是我并没有找到直接提供头部原始字节数据方法给我们用,没关系,解剖下MS的源代码,发现代码如下:

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是在第一次被访问时才初始化的,如果你的程序中没有用到它,那个这个对象会一直保持空值,MS考虑了细节

大家都看到了QueryStringBytes属性,原型如下internal byte[] QueryStringBytes,这个就是原始的QueryString字节了。出招了:

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=张三。

各种编码的转换都可以自己完成,毕竟得到提交的原始字节了,希望对大家解决querystring乱码问题有所帮助。

时间: 2024-11-14 08:16:51

ASP.NET QueryString乱码解决问题的相关文章

jquery+asp ajax 中文乱码问题

做网站的时候,因为网站最初设计的时候,没有考虑那么多, 设定了gb2312 的简体中文 作为网站编码. 作为中文用gb2312的编码属很正常的事件了,建站起来也没有什么大问题,包括自己编写JS Ajax也不会产生乱码问题 随着Jquery的流行,我也渐渐喜欢Jquery操作DOM的方法,后来把Jquery文件作为全站的公用JS库. Jquery的Ajax也挺好用,因为作为公用的文件了,所以不必再为每个需要Ajax的页面,再写什么XMLHTTPrequest这些对象,所以就开始使用Jquery的A

Asp.net QueryString批量插入和更新

public static string InsertOrUpdateQueryString(string[] keys, string[] values) { return InsertOrUpdateQueryString(System.Web.HttpContext.Current.Request, keys, values); } public static string InsertOrUpdateQueryString(System.Web.HttpRequest request,

ASP页面显示乱码解决方法/ASP设置编码

ASP页面显示乱码解决方法/ASP设置编码(转) 如果你发现浏览页面的时候出现乱码.你可以尝试一下步骤: 确保你页面本身编码格式正确:例如test.asp中使用charset=utf-8,那么请先确保这个文件本身就是Utf-8编码的.你可以利用记事本 进行转换.同样如果使用charset=GBK,请先确保这个文件本身就是GBK编码的. 确认你得到的原数据(例如从数据库中得到的数据)编码方式与页面编码方式一至. 尝试指定IIS按什么编码读取. <%@ codepage=65001%>UTF-8

Ubuntu下CodeBlocks控制台程序中文显示乱码解决问题

今天在CodeBlocks下折腾来半天,终于把中文乱码给解决了,其实很简单. 在环境设置里进行如下设置: 把Terminal to launch console programs那个选项改成gnome-terminal -t $TITLE -x 原来是xterm -T $TITLE -e

Eclipse 中读取properties文件中文乱码解决问题

在开发java中多少会遇到需要编辑properties等属性文件的时候,有时候用文本编辑器看到的内容会使各种的乱码入下图: 针对这种情况可以给Eclipse安装上一个插件Properties Editor,属性文件通过这个编辑器打开可以解决乱码问题. 安装插件方法:help--Eclipse Marketplace如下图,我的Eclipse是Mars Release (4.5.0)

Asp Url汉字乱码的问题

1.js <a target="_blank" href="/asp/download.asp?File=' + escape(item.FileName) + '">' + item.Title + '</a><br /> 2.Asp dim file file = Server.HTMLEncode(Request("File"))

jsp里post和get的乱码解决问题

6.乱码问题01:<%reques.setCharacterEncoding("utf-8");%> 02:get请求乱码 001.:String 编码之后的字符串 = new String(获取前的字符串.getBytes("iso-8859-1"),"utf-8"); 002:通过conf下的server.xml文档的<Connector port="8080" protocol="HTTP/1

乱码解决问题

在项目开发中常常遇到乱码问题,使我们很苦恼,下面我介绍经常遇见的乱码问题以及相应的解决办法. 1.post方式提交中文数据乱码产生的原因和解决办法 之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收. 由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的"

.Net 插入数据MySql数据库,中文乱码解决问题

1, 修改mysql根目录下配置文件my.ini,在[client]节点下添加default-character-set=utf8 ,在[mysqld]节点下添加character_set_server=utf8,然后重启mysql服务 2,修改根目录/data/performance_schema/db.opt文件 default-character-set=utf8 default-collation=utf8_general_ci 3,设置数据库基字符集为utf8 ,设置表字符集为utf8