如何对 RFC 3986 字符串进行转义
Posted
技术标签:
【中文标题】如何对 RFC 3986 字符串进行转义【英文标题】:How unescape RFC 3986 string 【发布时间】:2020-04-26 22:03:49 【问题描述】:我有一个RFC 3986 编码字符串,格式为%x##
。例如,空格字符被编码为%x20
而不是%20
。如何在 C# 中对其进行解码?
使用Uri
、HttpUtility
或WebUtility
类的解码方法,字符串未被解码。
【问题讨论】:
有帮助吗:***.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 字符串进行转义的主要内容,如果未能解决你的问题,请参考以下文章
RFC3986 - 哪些 pchars 需要进行百分比编码?
RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?
为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?
异常:Invalid character found in the request target. The valid characters are defined in RFC 3986