如何对 RFC 3986 字符串进行转义

Posted

技术标签:

【中文标题】如何对 RFC 3986 字符串进行转义【英文标题】:How unescape RFC 3986 string 【发布时间】:2020-04-26 22:03:49 【问题描述】:

我有一个RFC 3986 编码字符串,格式为%x##。例如,空格字符被编码为%x20 而不是%20。如何在 C# 中对其进行解码? 使用UriHttpUtilityWebUtility 类的解码方法,字符串未被解码

【问题讨论】:

有帮助吗:***.com/questions/846487/…。它可能是重复的 不允许使用空格(ascii 20),因此将其替换为编码字符串。 【参考方案1】:

您可以尝试正则表达式,以便Replace 与所有%x## 以及%## 匹配:

  using System.Text.RegularExpressions;

  ...

  string demo = "abc%x20def%20pqr";

  string result = Regex.Replace(
      demo, 
    "%x?([0-9A-F]2)", 
      m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(), 
      RegexOptions.IgnoreCase);

  Console.Write(result);

结果:

  abc def pqr

【讨论】:

没有任何标准的 .NET 方法可以做到这一点吗? @Matteo:看来我们得手动实现%x## case; Uri.UnescapeDataString() 适用于%## 擒纵机构【参考方案2】:

你可以试试这样: 你可以试试:

参考:How to get Uri.EscapeDataString to comply with RFC 3986

    var escapedString = new StringBuilder(Uri.EscapeDataString(value));

    for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++) 
        escapedString.Replace(UriRfc3986CharsToEscape[i], Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
    

    // Return the fully-RFC3986-escaped string.
    return escaped.ToString();

【讨论】:

以上是关于如何对 RFC 3986 字符串进行转义的主要内容,如果未能解决你的问题,请参考以下文章

如何对URL字符串进行百分号编码

RFC3986 - 哪些 pchars 需要进行百分比编码?

RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?

为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?

Java 和 RFC 3986 URI 编码

异常:Invalid character found in the request target. The valid characters are defined in RFC 3986