2015-11-13 1 views
0

У меня есть программа, которая comunicates с внешним сервером HTTP на запрос первого, второго значения и т.д. ... (, , , , ...)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

Я проверить связь с сервером с завитком и 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

В конструкторе требуется изменить litle, чтобы сделать работу add: Headers.Add («Content-Type», «application/x-www-form-urlencoded») ; –

0

Правильный символ Юникода для °: \u00B0. Вы можете найти here как работать с unicode в C#.

Все символы Юникода могут быть найдены here.

+0

Я использую мульфильмический порядковый указатель \ u00BA, юникод является строгим –