UTF-8 URL 编码

UTF-8 URL Encode

我在使用 HttpUtility.UrlEncode() 对查询参数进行编码时遇到问题,它没有转换为 UTF-8。

 query["agent"] = HttpUtility.UrlEncode("{\"mbox\":\"mailto: UserName@company.com\"}");

我尝试使用重载方法并通过 utf 编码,但仍然无法正常工作。

预期结果:

?agent=%7B%22mbox%22%3A%22mailto%3AUserName%40company.com%22%7D

实际结果:

?agent=%257b%2522mbox%2522%253a%2522mailto%253aUserName%2540company.com%2522%257d

     public StatementService(HttpClient client, IConfiguration conf)
    {
        configuration = conf;
        var BaseAddress = "https://someurl.com/statements?";             
        client.BaseAddress = new Uri(BaseAddress);
        client.DefaultRequestHeaders.Add("Custom-Header", 
                                          "customheadervalue");
        Client = client;
    }

   public async Task<Object> GetStatements(){
     var query = HttpUtility.ParseQueryString(Client.BaseAddress.Query);
     query["agent"] = HttpUtility.UrlEncode( "{\"mbox\":\"mailto:UserName@company.com\"}");

        var longuri = new Uri(Client.BaseAddress + query.ToString());
        
        var response = await Client.GetAsync(longuri);
        response.EnsureSuccessStatusCode();

        using var responseStream = await response.Content.ReadAsStreamAsync();

        dynamic statement = JsonSerializer.DeserializeAsync<object>(responseStream);
 //Convert stream reader to string 
        StreamReader JsonStream = new StreamReader(statement);
        string JsonString = JsonStream.ReadToEnd();
        //convert Json String to Object.
        JObject JsonLinq = JObject.Parse(JsonString);
        // Linq to Json
        dynamic res = JsonLinq["statements"][0].Select(res => res).FirstOrDefault();
        return await res;

}

我强烈建议您采用另一种方法,使用 Uri.EscapeDataString 方法。这个方法在 System.Net 而不是 System.Web 里面,那是一个沉重的 dll。此外 HttpUtility.UrlEncode 编码字符是大写的,这在某些情况下会成为实施 HTTP 协议时的一个问题。

Uri.EscapeDataString("{\"mbox\":\"mailto: UserName@company.com\"}")
"%7B%22mbox%22%3A%22mailto%3A%20UserName%40company.com%22%7D"

方法HttpUtility.ParseQueryString内部returns一个HttpValueCollectionHttpValueCollection.ToString() 已经执行了 url 编码,因此您无需自己执行此操作。如果你自己做,它会执行两次,你会得到你看到的错误结果。

我看不出与 UTF-8 的关系。您使用的值 ({"mbox":"mailto: UserName@company.com"}) 不包含任何在 UTF-8 中看起来不同的字符。

参考文献: