蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 597, 评论 - 4064, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:学习笔记:7种结构型设计模式简单对比
    <p>最新在家创业系统 ----刚从国外引进,市场巨大。 ----在家可经营所有国家生意,事业规模宏大。 ----不需求人与说服;不用放厚脸皮去推销。 ----极小投资;零风险;成...
    by jackielongteng(注册) on 2009/6/14 13:43:56
  • re:作用域
    <p>☆                    &deg;∵☆       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
    by jackielongteng(注册) on 2009/6/14 13:03:25
  • re:Html标签嵌套对展示性能的影响
    <p><strong>所有的浏览器都按照你提到的浏览器解析Html规则来解析嘛?</strong></p>
    by Cola(注册) on 2009/6/12 23:07:28
  • re:Html5
    <p>目前来说,HTML5还只是一个梦想,呵呵:)</p>
    by 开心就好(注册) on 2009/6/11 16:31:54
  • re:多线程与SqlConnection.Close
    <p>好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:<a href="http://www.servicezon.co...
    by qzhibo(注册) on 2009/6/3 15:14:21
  • re:多线程Singleton单件模式
    <pre><span style="color: #0000ff;">//Another way public</span> <sp...
    by Yaojian(注册) on 2009/4/22 14:02:35
  • re:Thread.Sleep(0)
    <p>学习了~</p>
    by shuitong888(注册) on 2009/4/8 14:29:24
  • re:Html标签嵌套对展示性能的影响
    <p>DIV固然好 但IE6,7,8 firefox,safari ....做美工的人要累死.</p>
    by ryq1(注册) on 2009/4/3 14:16:25
  • re:用.net 编码实现朗读文本的方法
    <p>我第一次 按键时 能听到声音,但是第二次按键时,没反应。网页一直在 loading.&nbsp;是什么原因?</p>
    by tracytang949(注册) on 2009/3/27 7:01:09
  • re:information_schema.routines与sysobjects
    <p>用sys.procedures多好。</p>
    by luke(注册) on 2009/3/16 16:45:49
  • re:SQL Server 2005 配置发送邮件
    <p>&lt;A href="<a href="http://www.3rt.info">http://www.3rt.info</...
    by ives007(注册) on 2009/2/26 16:47:00
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:45:08
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:32:06
  • re:虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案
    <p>google newsid</p>
    by iads(注册) on 2009/2/13 17:25:07
  • re:try catch 与线程
    <p>确实是这样的。因为异常机制本质上是堆栈操作,而各线程的堆栈是独立的。</p>
    by st_szr(注册) on 2009/1/21 9:46:05
  • re:try catch 与线程
    <p>没啥啊,线程就是新启动了一个,当然异常不会影响到原有的线程了。</p> <p>你应该在线程里面合适的位置写上自己的捕获代码就行了。</p>
    by laozizhu(注册) on 2009/1/19 16:33:21
  • re:我的2008,征服天堂
    <p>蝈蝈,可惜我帮不了你啊!</p>
    by laozizhu(注册) on 2009/1/19 16:25:45
  • re:try catch 与线程
    <p>呃&hellip;&hellip;是这样的。可怎么处理呢?</p>
    by Anders Liu(注册) on 2009/1/19 11:58:05
  • re:我的2008,征服天堂
    <p>博主是不是去了师部 做了侦查营长呢?</p>
    by huobazi(注册) on 2009/1/9 14:15:33
  • re:我的2008,征服天堂
    <p>@ghj1976:看来真的危机了</p>
    by 开心就好(注册) on 2009/1/9 10:17:37
  • re: 网络带宽的单位
    不过传输的时候,往往还有压缩。
    by luke(匿名) on 2008/12/15 11:00:21
  • re: 网络带宽的单位
    除10不仅仅是为了方便,在传输中,往往加上控制位,所以一个字节往往需要10Bit.
    by 关门放狗(匿名) on 2008/12/13 16:01:30
  • re: 多缓存并存
    对跨进程甚至跨服务器缓存的性能比较怀疑,进程通信和跨服务器通信代价不菲。即使有已有进程外数据可用,如果考虑在进程做份缓存,定期再进程间同步是否更佳?
    by jinglecat(匿名) on 2008/12/12 18:00:05
  • re: 网络带宽的单位
    好像还有一个为了方便换算,厂家使用的是 除10的处理方式的说法:于是100Mb/sec = 100M / 10 = 10M Byte/sec 所以我通常都是用除10而不是除8来做运算的。
    by kentliu(匿名) on 2008/12/11 11:38:55
  • re: 网络带宽的单位
    又不是大S小s
    by luke(匿名) on 2008/12/10 12:04:50

广告

 

先看下面两个Url,他们传递的参数一样么??
aaa.aspx?tag=.net%bc%bc%ca%f5
aaa.aspx?tag=.net%e6%8a%80%e6%9c%af

看起来好像是不一样,其实他们都是对".net技术"进行了UrlEncode,不过一个是GB2312的编码,一个是Utf-8的编码。
如下代码就可以获得上面的编码后效果:

string tmp1 = System.Web.HttpUtility.UrlEncode(".net技术", System.Text.Encoding.GetEncoding("GB2312"));
string tmp2 = System.Web.HttpUtility.UrlEncode(".net技术", System.Text.Encoding.UTF8);

我们实际的Web页面,可能会被其他程序调用。
比如:简体中文操作系统上的一个ASP页面,需要向一个ASP.net页面传递一个带中文的参数。
默认情况下,简体中文操作系统上, ASP 的 Server.UrlEncode 方法会把中文以GB2312的编码进行编码,
但是默认情况下,ASP.net的页面是采用的UTF-8编码。
这种情况下,你在用 Request.QueryString["Tag"] 接受值的时候会接受不到中文信息,单步调试看到的是乱码。
这时候虽然用Request.QueryString["Tag"] 接受的是乱码,但这时候的Url并不是乱码。

解决方法就是自己分析Url中的参数,然后对参数的值按照 GB2312的编码反解密,而不是用.net 默认的Utf-8的编码反解密。
其实微软类似的提供了相应的函数,我们不必自己用正则表达式去分析url字符串了。

演示代码如下:

string q = Request.Url.Query;

System.Collections.Specialized.NameValueCollection nv =
 System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312"));
Response.Write(nv["Tag"]);

我们用 Lutz Roeder's .NET Reflector  来看 System.Web.HttpUtility.ParseQueryString 方法的实现:
一直反查进去,我们可以看到最终处理Url参数字符串分析的代码如下:
 
System.Web.HttpValueCollection 类的如下函数实现了对Url参数的解析
这里我们看到,它是自己一个个字符进行的分析。

internal void FillFromString(string s, bool urlencoded, Encoding encoding)
{
      int num1 = (s != null) ? s.Length : 0;
      for (int num2 = 0; num2 < num1; num2++)
      {
            int num3 = num2;
            int num4 = -1;
            while (num2 < num1)
            {
                  switch (s[num2])
                  {
                        case '=':
                              if (num4 < 0)
                              {
                                    num4 = num2;
                              }
                              break;
                  }
                  num2++;
            }
            string text1 = null;
            string text2 = null;
            if (num4 >= 0)
            {
                  text1 = s.Substring(num3, num4 - num3);
                  text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
            }
            else
            {
                  text2 = s.Substring(num3, num2 - num3);
            }
            if (urlencoded)
            {
                  base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
            }
            else
            {
                  base.Add(text1, text2);
            }
            if ((num2 == (num1 - 1)) && (s[num2] == '&'))
            {
                  base.Add(null, string.Empty);
            }
      }
}

至于对方传递给自己的是哪种编码方式,最好也一并作为参数传递过来,这样我们就可以根据用户的这个参数进行解密操作。

打印 | 张贴于 2006-04-19 23:00:00 | Tag:.net 编程心得  技术随笔  网站开发管理相关内容

留言反馈

# 使用 Request.QueryString 接受参数时,跟编码有关的一些问题 编辑
我们先来看以下几个请求,看a.aspx页面用Request.QueryString接受到的是啥信息?页面URLRequest.QueryString[
2007-12-17 12:24:00 | [匿名用户:csdnexpert]
#回复: 解密不同编码的的参数。 编辑
不是用.net 默认的Utf-8的编码反解密。
其实微软类似的提供了相应的函数,我们不必自己用正则表达式去分析url字符串了。
2006-12-17 21:35:00 | [匿名用户:视频会议]
#re: 解密不同编码的的参数。 编辑
NOBxV7hXAl0blS+pVq8evAK+nqZ7qSzexCuvgYnwgxMemkDgJ/OyR8FdBh0Usy2RX4YIUMti+JLZP770BRkyeVrkmEHt9bPv1ub9KTsZSKEKQyWikhdH6/qSp5OOVEwike53euFfyKf3PGF1QFrgrWkqvK4qblNO9BosV/o3QCmYXnOhsbucm4N75cfQrvljgpWvN/VgVYHfEi6d5nE91MgRWwFUjRN/FQ1TtbgLTtKNxrrBo4rRcVzIYDMigB9EiN8gdQ6e7Gc=

请问这段能不能帮忙破解一下
2006-06-05 17:16:00 | [匿名用户:zsp]
#解密不同编码的的参数 编辑
解密不同编码的的参数
2006-04-29 21:14:00 | [匿名用户:H_J_H]
#re: 解密不同编码的的参数。 编辑
楼上的,没有办法通过程序判断,最多你试一下用哪种方式解码获得的不是乱码来判断。
====================

可是程序中又如何知道是不是乱码呢?
2006-04-24 09:02:00 | [匿名用户:Xpc]
#re: 解密不同编码的的参数。 编辑
@勇者之心

谢谢,我试试。
2006-04-22 14:02:00 | [匿名用户:木野狐]
#re: 解密不同编码的的参数。 编辑
@木野狐

你数据库里的乱码应该是用错误的 Encoding 解码出来的字符串,应该用那个 Encoding 编码成原来的 byte[] 然后再用某个正确的 Encoding 解码。
2006-04-21 22:09:00 | [匿名用户:勇者之心]
#re: 解密不同编码的的参数。 编辑
我想请教一下,有时候数据库(SQL Server 2000, 字段的数据类型用的是 nvarchar). 中出现用户录入的乱码。也是因为页面不同编码的问题造成的,那么有办法恢复这些乱码数据吗?

我尝试过先用 select convert(varbinary, 字段名) 得到其数值,然后用各种 Encoding 来解密,可是没有一种能显示为正常的。(试过了 .NET 2.0 里面提供的 System.Text.Encoding.GetEncodings 能得到的所有 encoding.
2006-04-20 21:00:00 | [匿名用户:木野狐]
#re: 解密不同编码的的参数。 编辑
楼上的,没有办法通过程序判断,最多你试一下用哪种方式解码获得的不是乱码来判断。
2006-04-20 12:21:00 | [匿名用户:鼠·神·泪]
#re: 解密不同编码的的参数。 编辑
但有时传入一个链接我不知道采用的是什么编码,有什么办法来判断吗?
2006-04-20 08:30:00 | [匿名用户:Xpc]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8