2015-11-13 30 views
0

我有與外部HTTP服務器對所述請求的第一,第二等的值comunicates程序...(,... )FormUrlEncode返回編碼º(男性序指示符)出乎意料的結果

我在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

I測試與捲曲和Firefox控制檯 並將結果服務器的通信應當是:

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

不知何故額外的%C2 C#劑量nt與服務器一起工作。

如何正確修復或逃避º

+0

看看這個問題有多少努力使這個問題變得更好?這裏的問題不僅僅是英語問題。您通常應該期待我們將同樣的努力投入到您對問題的迴應中。 –

+0

@Joel Coehoorn對不起,但英語不是我的語言,我不是我的努力是我所知道的。 –

+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

需要在構造函數中做一些小改動來完成這項工作:添加:Headers.Add(「Content-Type」,「application/x-www-form-urlencoded」) ; –

0

°的正確的Unicode字符是\u00B0。更多信息你能找到here如何在C#中使用unicode。

所有的Unicode字符都可以找到here

+0

我使用\ u00BA陽性順序指示符unicode是rigth –