代码之家  ›  专栏  ›  技术社区  ›  brimstone

C#百分比解码

  •  1
  • brimstone  · 技术社区  · 9 年前

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

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

    %C9%90%04L%EFEA%D1U%AFi%CBc%3A%E5%D0%40Q%D6%1Bn%C9%C3%B5%0FT%FC%E5h%95m%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%f%BF%BDI%EF%BF%BDC%3A%EF%BF%EF%BF%ff%BF%40Q%EF%f%BF%BF%1BN%EF%BF BF%C3%B5%0FT%EF%f%BF%BD%EF%BF%BD%ref%BF%BD%1B%EF%BF%BDZO%02

    这绝对不是我输入查询字符串的内容。当看到它时,它第一次搞砸是 %EF (从原始查询字符串的第11个字符开始)。而不是 %参考 它显示: %EF%BF%BD 当我搜索了一下,我发现 this webpage 其表示“十六进制UTF-8字节”是EF BF BD。

    编辑:

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

    令牌=%c9%90%04L%ef%bf%bdEA%ef%bf%bdU%ef%bf%bdi%ef%f%bdc%3a%ef%a%bf%24tB%ef%c3%bb5%0fT%bf%%ef%bf%bd%ef%f%bb%ef%bf%bd%1b%ef%bf%bdZo%02&oauth_token_secret=S%23%2bw%ef%bf%bb%ef%f%bdX%17%ef%bf%bd0%ef%bf%bd%bd%60%ef%bf%bf%bd%ef%bf%bd%bf%ef%bf%%bd*%ef%bf%f%f%bdi%08%ef%f%bf%%ef%bbf%f%f%f%1e%ef%bf%bd%d7%832%d1%a1%ef%ff%bbd%275%ef%bf%bdv%ef%bf%bd

    2 回复  |  直到 8 年前
        1
  •  3
  •   Anton    9 年前

    你可能正在寻找 HttpServerUtility.UrlDecode method :

    HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString["token"]);
    
        2
  •  1
  •   David    9 年前

    你的错误在其他地方。。。

    我在.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来运行页面,该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:@QnThm$tB;佐伊

    (URL是对二进制字符串进行编码的,因此当打印实际字符串时,有些字符无法显示。)

    如果你运行这个和 代币 实际上打印“%C9%90%04L…”,那么您的令牌可能已被双重编码。所有百分号都将替换为“%25”,因此您的URL将如下所示:

    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。