Получение HttpWebRequest для использования кодировки ISO-8859-1 для urlencoding

У меня проблема с тем, чтобы HttpWebRequest использовал кодировку ISO-8859-1 для параметров в веб-запросе, проблема связана как с POST, так и с GET.

Вкратце проблема заключается в том, что любые параметры запроса, содержащие не-ascii-символы, такие как Ö и æ, преобразуются в их представления UTF-8 %, а не в их представления ISO-8859-1.

Ö преобразуется в %c3%96 вместо %d6.

Моя текущая идея для решения состоит в том, чтобы преобразовать строку запроса в массив байтов ISO-8859-1, а затем преобразовать массив байтов обратно в UTF-8, char для char, перехватывая любые байты > 127 и преобразовывая их в их % шестнадцатеричные значения вместо этого.

Есть ли лучший способ решить эту проблему?


person Grubsnik    schedule 11.11.2010    source источник
comment
Какой метод вы используете для их кодирования в настоящее время?   -  person Marc Gravell    schedule 11.11.2010
comment
В настоящее время нет, что доставляет нам проблемы, поскольку .net, похоже, по умолчанию использует UTF-8.   -  person Grubsnik    schedule 11.11.2010


Ответы (2)


Создайте свой собственный алгоритм кодирования URL следующим образом; метод WebRequest будет использовать URI, указанный вами в пользовательской кодировке.

string input = "http://www.example.com/q?Ö=æ";

StringBuilder sb = new StringBuilder();
foreach (byte by in Encoding.GetEncoding("ISO-8859-1").GetBytes(input))
{
    // NOTE: This is very simplistic; a robust solution would probably really need
    // to handle all non-alphanum and non-reserved characters, as specified by
    // http://www.ietf.org/rfc/rfc2396.txt
    if (by <= 0x7F)
        sb.Append((char) by);
    else
        sb.Append(string.Format("%{0:X2}", by));
}

Uri uri = new Uri(sb.ToString());
// uri.AbsoluteUri == "http://www.example.com/q?%D6=%E6"

WebRequest request = WebRequest.Create(uri);
using (request.GetResponse())
{
    // ...
}
person Bradley Grainger    schedule 11.11.2010
comment
Это было решение, которого я надеялся избежать, но тем не менее очень элегантная его реализация. - person Grubsnik; 12.11.2010

Я бы предпочел попытаться исправить «другую сторону трубы» и заставить ее принимать utf-8. UTF-8 - это то, что вам нужно, если вы хотите быть «надежным на будущее».

person Mihai Nita    schedule 13.11.2010
comment
У нас нет никакой формы контроля над веб-сайтами, к которым мы обращаемся. Поэтому тот факт, что веб-сайты могут быть ужасно устаревшими, мы не можем решить. - person Grubsnik; 15.11.2010