(转)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乱码问题有所帮助。
(转)ASP.NET QueryString乱码解决问题的更多相关文章
- ASP.NET QueryString乱码解决问题
正常的情况下,现在asp.net的网站很多都直接使用UTF8来进行页面编码的,这与Javascript.缺省网站的编码是相同的,但是也有相当一部分采用GB2312. 对于GB2312的网站如果直接用j ...
- asp.net url参数中有中文request.querystring 乱码
说明: 从这点我们发现:所有的参数输入,都调用了一次:HttpUtility.UrlDecode(str2, encoding); 结论出来了: 当客户端js对中文以utf-8编码提交到服务端时,用R ...
- ASP源代码中文乱码怎么办
ASP程序如果是UTF-8编码格式将会乱码,将其转换为ASCII码即可 如图所示
- Asp.net QueryString批量插入和更新
public static string InsertOrUpdateQueryString(string[] keys, string[] values) { return InsertOrUpda ...
- jenkins乱码解决问题
1.jenkins控制台线上乱码解决 系统管理——系统设置,添加编码环境变量 zh.CH.UTF-8 2.java启动后,tomcat日志显示乱码,原因是环境变量没有带过去,因此shell脚本头部需要 ...
- Asp Url汉字乱码的问题
1.js <a target="_blank" href="/asp/download.asp?File=' + escape(item.FileName) + ' ...
- zabbix超级乱码解决问题
个人而言,网上那些方法并不顶什么用,研究了一番总结出了自己的一个方法. 像这种,出现了严重乱码,也不是像网上说的那样把楷体复制过去就好.事实证明我复制过去好多次了,然而并没有什么用. 下面是我自己总结 ...
- jsp里post和get的乱码解决问题
6.乱码问题01:<%reques.setCharacterEncoding("utf-8");%> 02:get请求乱码 001.:String 编码之后的字符串 = ...
- Ajax的乱码解决问题?
Javascript是使用UTF-8国际编码,即每个汉字用4个字节来存储,这就造成了用AJAX来send数据的时候出现会乱码. Ajax乱码产生主要有2个原因 1. XMLHttpRequest返回的 ...
随机推荐
- C# 利用BarcodeLib.dll生成条形码
首先效果: 1:首先下载BarcodeLib.dll 下载地址 http://pan.baidu.com/share/link?shareid=2590968386&uk=2148890391 ...
- CentOS升级内核的方法
升级前的内核版本为:2.6.32-431.el6.x86_64 升级后的内核版本为:3.10.101-1.el6.elrepo.x86_64 升级方法: 1.导入key rpm --import ht ...
- Java for selenium(webdriver) 环境搭建
开发环境 1. jdk1.7 2. Eclipse 3. selenium(selenium-java-2.42.2.zip) 将下载下来的 selenium-java-2.42.2.zip 解压, ...
- 算法 python实现(一) 基本常识
我算法和数据结构都不好,笨的一比. 现在的目标是熟悉常见和经典算法,看本站两个大牛的博客,在这也推荐一下,特别好,除了算法其他的技术也很不错. Vamei : http://www.cnblogs.c ...
- ORACLE与.NET类型对应关系(转)
ORACLE与.NET类型对应关系 想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键 ...
- 【解决】Internet访问看似正常(无叹号受限)却打不开网页
嘛╮(╯▽╰)╭ 可能是前几天中了一等奖败了人品 .. 今天果断受点小挫折 事情是这样的:昨晚电脑在不插电的情况下打了一小时“剑灵”,有点烫,电量剩30%,关机睡觉,今早发现上不去网页了! 桌面右下角 ...
- B树,B-树,B+树,B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- 集中式vs分布式
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候 ...
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...
- hdu1698(线段树的区间替换)
HDU1698 #include <bits/stdc++.h> using namespace std; #define Maxn 1001000*4 struct Node{ int ...