FormUrlEncode返回编码º(男性序数指标)的意外结果

时间:2015-11-13 14:36:06

标签: c# urlencode

我有一个程序与外部http服务器通信,请求第一个,第二个等值......( ,...)

我在c#中遇到º字符的问题。

以下是一些示例代码:

var testdata=new Dictionary<string,string>{
    {"val","º"},
    {"val1","\xBA"},
    {"val2","\u00BA"},
};
var content = new FormUrlEncodedContent(testdata);
var cont = content.ReadAsStringAsync().GetAwaiter().GetResult();

结果是:

val=%C2%BA&val1=%C2%BA&val2=%C2%BA

我使用curl和firefox控制台测试与服务器的通信 结果应该是:

val=%BA&val1=%BA&val2=%BA

不知何故,C#中的额外%C2与服务器配合使用。

如何正确修复或转义º

2 个答案:

答案 0 :(得分:2)

此问题与FormUrlEncodedContent使用的默认编码有关,UTF-8且您的服务器期望ISO-8859-1

以下是解决此问题的解决方法,但您(不幸的是)需要将System.Web添加到您的项目中:

// This is an implementation of FormUrlEncodedContent with `ISO-8859-1`
public class FormIso8859Encoder : ByteArrayContent
{
    public FormIso8859Encoder(IEnumerable<KeyValuePair<string, string>> nameValueCollection) 
         : base(FormDataToByteArray(nameValueCollection))
    {
         Headers.Add("Content-Type", "application/x-www-form-urlencoded");  
    }

    private static byte[] FormDataToByteArray(IEnumerable<KeyValuePair<string, string>> nameValueCollection)
    {
        StringBuilder sb = new StringBuilder();

        foreach (var nameValue in nameValueCollection)
        {
            if (sb.Length > 0)
                sb.Append('&');

            sb.Append(nameValue.Key);
            sb.Append('=');

            // Here is the major change
            sb.Append(HttpUtility.UrlEncode(nameValue.Value, Encoding.GetEncoding("iso-8859-1") ));
        }

        return Encoding.Default.GetBytes(sb.ToString());
    }
}

然后

var testdata=new Dictionary<string,string>{
    {"val","º"},
    {"val1","\xBA"},
    {"val2","\u00BA"},
};
var content = new FormIso8859Encoder(testdata);
var cont = content.ReadAsStringAsync().GetAwaiter().GetResult();

这提供了以下输出:

val=%BA&val1=%BA&val2=%BA

答案 1 :(得分:0)

°的正确unicode字符为\u00B0。您可以通过更多信息找到here如何使用C#中的unicode。

可以找到所有unicode字符here