Могу ли я использовать Unicode для декодирования HTTP-запроса? - PullRequest
3 голосов
/ 09 мая 2009

Я понимаю, что кодировкой HTTP-запроса по умолчанию является ISO 8859-1.

Могу ли я использовать Unicode для декодирования HTTP-запроса в виде байтового массива?

Если нет, как бы я расшифровал такой запрос в C #?

РЕДАКТИРОВАТЬ: Я разрабатываю сервер, а не клиент.

Ответы [ 4 ]

3 голосов
/ 09 мая 2009

Как вы сказали, кодировка HTTP POST-запроса по умолчанию - ISO-8859-1. В противном случае вы должны посмотреть на заголовок Content-Type, который может выглядеть как Content-Type: application/x-www-form-urlencoded; charset=UTF-8.

После того, как вы прочитали опубликованные данные в байтовый массив, вы можете решить преобразовать этот буфер в строку (помните, что все строки в .NET имеют формат UTF-16). Только в этот момент вам нужно знать кодировку.

byte[] buffer = ReadFromRequestStream(...)
string data = Encoding
              .GetEncoding("DETECTED ENCODING OR ISO-8859-1")
              .GetString(buffer);

И чтобы ответить на ваш вопрос:

Могу ли я использовать Unicode для декодирования HTTP-запрос в виде байтового массива?

Да, если для кодирования этого байтового массива использовался юникод:

string data = Encoding.UTF8.GetString(buffer);
1 голос
/ 09 мая 2009

Вы не используете кодировку Unicode для декодирования того, что не закодировано с использованием кодировки Unicode, так как это не будет правильно декодировать все символы.

Создайте Encoding объект для правильной кодировки и используйте это:

Encoding iso = Encoding.GetEncoding("iso-8859-1");
string request = iso.GetString(requestArray);
0 голосов
/ 09 мая 2009

Каждый раз, когда .NET передает информацию между внешним представлением (например, сокетом TCP) и внутренним форматом Unicode (или наоборот), используется некоторая форма кодирования.

См. utf-8-vs-unicode , особенно Ответ Джона Скита , со ссылкой на статью Джоэла Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, позитивно должен знать о Юникод и наборы символов (без оправданий!) .

0 голосов
/ 09 мая 2009


Код, приведенный ниже, должен помочь, если вы ожидаете большого объема потоковой передачи данных, тогда выполнение асинхронно - лучший способ.

string myUrl = @"http://somedomain.com/file";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(myUrl);

//Set some reasonable limits on resources used by this request
request.MaximumAutomaticRedirections = 4;
request.MaximumResponseHeadersLength = 4;
request.Timeout = 15000;

response = (HttpWebResponse)request.GetResponse();                              

Stream receiveStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

StreamReader readStream = new StreamReader(receiveStream, encode);

Char[] read = new Char[512];

// Reads 512 characters at a time.
int count = readStream.Read(read, 0, 512);

while (count > 0)
{
  // Dumps the 512 characters on a string and displays the string.
  String str = new String(read, 0, count);
  count = readStream.Read(read, 0, 512);
}
...