You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使HttpValueCollection采用目标API要求的URL编码格式?

解决HttpValueCollection生成UTF-8格式URL编码的问题

首先明确一点:HttpValueCollection(也就是HttpUtility.ParseQueryString返回的对象)的默认ToString()方法确实会生成%uXXXX这种Unicode转义格式,这是.NET Framework中这个类的固有行为,没办法直接修改它的编码方式来生成UTF-8的%XX%XX格式。不过我们可以通过手动处理参数编码来达到目标API的要求。

解决方案1:手动编码单个参数并拼接查询字符串

直接使用HttpUtility.UrlEncode方法并指定UTF-8编码,自己构建查询字符串:

var original = "АБ";
// 指定UTF-8编码进行URL编码
var encodedArg = HttpUtility.UrlEncode(original, Encoding.UTF8);
// 拼接成最终的查询字符串
var queryString = $"Arg={encodedArg}";
// 最终结果:Arg=%D0%90%D0%91

解决方案2:处理多个参数的场景

如果需要处理多个参数,可以用StringBuilder来逐个编码并拼接,避免手动拼接的繁琐:

var parameters = new Dictionary<string, string>
{
    {"Arg", "АБ"},
    {"AnotherArg", "Привет"}
};

var sb = new StringBuilder();
foreach (var kvp in parameters)
{
    if (sb.Length > 0)
        sb.Append("&");
    // 对键和值都进行UTF-8编码,避免特殊字符问题
    var encodedKey = HttpUtility.UrlEncode(kvp.Key, Encoding.UTF8);
    var encodedValue = HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
    sb.Append($"{encodedKey}={encodedValue}");
}

var finalQueryString = sb.ToString();
// 结果会是 Arg=%D0%90%D0%91&AnotherArg=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82

为什么默认是%u格式?

在.NET Framework中,HttpValueCollection的ToString()方法内部使用的是HttpEncoder.Default,它会将非ASCII字符编码为%uXXXX格式(UTF-16的代码单元转义),这是一种比较旧的编码方式,现在大多数现代API都采用UTF-8的percent-encoding(也就是%XX的格式),所以需要我们手动指定编码来适配。

如果是在.NET Core/.NET 5+环境中,QueryString类默认就会使用UTF-8编码,不过你的代码看起来是基于.NET Framework的,所以上面的方案更适合你的场景。

内容的提问来源于stack exchange,提问作者user626528

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:30:45