2009-05-09 2 views
2

Я понимаю, что стандартная кодировка HTTP-запроса - это стандарт ISO 8859-1.Могу ли я использовать Unicode для декодирования HTTP-запроса?

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

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

EDIT: Я разрабатываю сервер, а не клиент.

ответ

3

Как вы сказали, кодировка по умолчанию 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); 
0


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

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); 
} 
+0

К сожалению, это выглядит как код для запроса с веб-ресурса и декодировать ответ. Думаю, я должен уточнить свой вопрос. Вы делаете что-то с UTF-8 там ... Могу ли я просто использовать это для декодирования HTTP-запроса? –

1

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

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

Encoding iso = Encoding.GetEncoding("iso-8859-1"); 
string request = iso.GetString(requestArray); 
+0

Это помогает! Но в моем случае это было так: 'www.responseHeaders.TryGetValue (« AUTHOR », out sAuthor); sName = HttpUtility.UrlDecode (sName); Кодирование iso = Encoding.GetEncoding ("iso-8859-1"); string name = Encoding.UTF8.GetString (iso.GetBytes (sAuthor)); ' –

+0

@SubtleFox: Если вам нужно сделать это, чтобы получить правильный результат, тогда строка' sAuthor' была создана путем декодирования данных с использованием неправильной кодировки начать с.Сделать это не является надежным способом ее решения, так как некоторые символы могут быть потеряны при первом некорректном декодировании. Вы должны решить его, где строка сначала декодируется, а не пытаться исправить ее впоследствии. – Guffa

0

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

См. utf-8-vs-unicode, особенно Jon Skeet's ответ со ссылкой на статью Джоэля The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

+0

Статья Джоэла была самой причиной того, что я решил подумать о кодировании, а не просто слепо использовать ASCII: p –

+0

Помните, что UTF-8 или даже UTF-16 не Unicode. – gimel

Смежные вопросы