C#百分比解码

时间:2016-02-11 15:18:28

标签: c# urlencode

我正在尝试解码从PHP脚本传递到我的C#应用​​程序的百分比编码字符串。 PHP会对数据进行加密,因此我会对许多特殊字符进行百分比编码。

这是我在网址中传递的字符串:

  

%C9%90%04L%EFEA%D1U%图AFi%CBC%3A%E5%D0%40Q%D6%1BN%C9%C3%B5%0FT%FC%E5H%95米%EF%BF%24TB% A6%D1%08%3B%83%A1%CF%1B%99Zo%02

但它解码部分的麻烦百分比:当我获取查询字符串时,如下所示:

var queryString = HttpContext.Current.Request.QueryString;
var token = queryString["token"];

变量token等于:

  

%C9%90%04L%EF%BF%BDEA%EF%BF%BDU%EF%BF%BDI%EF%BF%BDC%3A%EF%BF%BD%EF%BF%BD%40Q% EF%BF%BD%1BN%EF%BF%BD%C3%B5%0FT%EF%BF%BD%EF%BF%BDH%EF%BF%BDM%EF%BF%BD%24TB%EF%BF% BD%EF%BF%BD%08%3B%EF%BF%BD%EF%BF%BD%EF%BF%BD%1B%EF%BF%BDZO%02

这绝对不是我放入查询字符串的内容。在查看它时,它第一次混乱是%EF(在原始查询字符串中开始第11个字符)。它显示%EF而不是%EF%BF%BD//Run timer $(document).ready(function () { if($('input[name=active_question]').val()!="") { start_timer(); } }); function start_timer() { var x=0; function doStuff() { x++; $('.timer').html(x+' sec'); console.log('Timer:'+x); $.ajax({ method: "GET", url: "/services/get_active_question/" }) .done(function( data ) { //It is time to regenerate the question values. console.log('Data:'+data); if(data['id']!=0) { regenerate_question(data); } }); } setInterval(doStuff, 1000); } function regenerate_question(data) { if(data['id']!=0) { console.log('A: '+data['a']); $('.progress-a').prop('value',data['a']); $('.progress-b').prop('value',data['b']); $('.progress-x').prop('value',data['x']); $('.progress-y').prop('value',data['y']); } } 。当我搜索一下时,我发现this webpage表示" Hex UTF-8 Bytes"是EF BF BD。

编辑:

忘了提,QueryString看起来像这样:

  

标记=%C9%90%04L%EF%BF%BDEA%EF%BF%BDU%EF%BF%BDI%EF%BF%BDC%3A%EF%BF%BD%EF%BF%BD% 40Q%EF%BF%BD%10亿%EF%BF%BD%C3%B5%0fT%EF%BF%BD%EF%BF%BDH%EF%BF%BDM%EF%BF%BD%24TB%EF% BF%BD%EF%BF%BD%08%3B%EF%BF%BD%EF%BF%BD%EF%BF%BD%1B%EF%BF%bdZo%02安培; oauth_token_secret = S%23%2BW% EF%BF%BD%EF%BF%BDX%17%EF%BF%BD0%EF%BF%BD%60%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF% BD *%EF%BF%BDI%08%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%07%EF%BF%BD%12RS07%EF%BF%bdgl %1E%EF%BF%BD%D7%832%D1%A1%EF%BF%BD%275%EF%BF%BDV%EF%BF%BD

2 个答案:

答案 0 :(得分:3)

您可能正在寻找HttpServerUtility.UrlDecode method

HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString["token"]);

答案 1 :(得分:1)

您的错误在其他地方......

我在.Net 4.0项目中创建了一个新网页,并将其放在Page_Load中:

protected void Page_Load(object sender, EventArgs e)
{
    var queryString = HttpContext.Current.Request.QueryString;
    var token = queryString["token"];
    throw new Exception(token);
}

然后我通过转到与您在上面提供的查询字符串匹配的URL来运行页面:

  

http://localhost:27151/test.aspx?token=%c9%90%04L%ef%bf%bdEA%ef%bf%bdU%ef%bf%bdi%ef%bf%bdc%3a%ef%bf%bd%ef%bf%bd%40Q%ef%bf%bd%1bn%ef%bf%bd%c3%b5%0fT%ef%bf%bd%ef%bf%bdh%ef%bf%bdm%ef%bf%bd%24tB%ef%bf%bd%ef%bf%bd%08%3b%ef%bf%bd%ef%bf%bd%ef%bf%bd%1b%ef%bf%bdZo%02

该页面对token进行了解码,并将其显示在异常消息中:

  

ɐLEAUic:@QnõThm$ TB;咗

(URL正在编码二进制字符串,因此在打印实际字符串时,有些字符无法显示。)

如果您运行此操作且token实际打印“%C9%90%04L ...”,那么您的令牌可能已被双重编码。所有百分号都将替换为“%25”,因此您的网址将如下所示:

  

http://localhost:27151/test.aspx?token=%25c9%2590%2504L%25ef%25bf%25bdEA%25ef%25bf%25bdU%25ef%25bf%25bdi%25ef%25bf%25bdc%253a%25ef%25bf%25bd%25ef%25bf%25bd%2540Q%25ef%25bf%25bd%251bn%25ef%25bf%25bd%25c3%25b5%250fT%25ef%25bf%25bd%25ef%25bf%25bdh%25ef%25bf%25bdm%25ef%25bf%25bd%2524tB%25ef%25bf%25bd%25ef%25bf%25bd ......

由于您未提及“%25”,因此错误位于代码中的其他位置。您认为正在使用的URL不是正在解码的URL。