2009-05-09 8 views

Antwort

3

Wie Sie bereits sagten, ist die Standardcodierung einer HTTP-POST-Anforderung ISO-8859-1. Andernfalls müssen Sie den Content-Type-Header betrachten, der dann wie Content-Type: application/x-www-form-urlencoded; charset=UTF-8 aussieht.

Sobald Sie die geposteten Daten in einem Byte-Array gelesen haben, können Sie diesen Puffer in einen String konvertieren (denken Sie daran, dass alle Strings in .NET UTF-16 sind). Es ist nur in diesem Moment, dass Sie die Codierung kennen müssen.

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

Und Ihre Frage zu beantworten:

Kann ich Unicode verwenden, um eine HTTP-Anforderung als Byte-Array gegeben zu entschlüsseln?

Ja, wenn Unicode diesen Byte-Array zu kodieren, verwendet wurde:

string data = Encoding.UTF8.GetString(buffer); 
0


Der unten angegebene Code sollte Ihnen helfen, wenn Sie große Datenmengen erwarten, die heruntersummen, dann ist es der beste Weg, um asynchron zu verfahren.

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

Entschuldigung, das sieht aus wie Code aus einer Webressource anfordern und die Antwort dekodieren. Ich denke, ich sollte meine Frage klären. Sie tun etwas mit UTF-8 dort ... Kann ich das nur verwenden, um eine HTTP-Anfrage zu dekodieren? –

1

Sie etwas zu entschlüsseln keine Unicode-Codierung verwenden, die nicht codiert ist, eine Unicode-Codierung verwenden, wie das wäre nicht Dekodieren Sie alle Zeichen korrekt.

Ein Encoding Objekt für die richtige Codierung und verwendet, die:

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

Es hilft! Aber in meinem Fall war es so: 'www.responseHeaders.TryGetValue (" AUTHOR ", aus sAuthor); sName = HttpUtility.UrlDecode (sName); Codierung iso = Encoding.GetEncoding ("iso-8859-1"); string name = Encoding.UTF8.GetString (iso.GetBytes (sAuthor)); ' –

+0

@SubtleFox: Wenn Sie dies tun müssen, um das korrekte Ergebnis zu erhalten, wurde der String' sAuthor' durch Decodieren von Daten mit der falschen Codierung erstellt beginnen mit.Dies zu tun ist keine zuverlässige Lösung, da einige Zeichen bei der ersten falschen Dekodierung verloren gehen können. Sie sollten es lösen, wo der String zuerst decodiert wird, nicht versuchen, es danach zu beheben. – Guffa

0

Jedes Mal.NET übertragen Informationen zwischen einer externen Darstellung (zB ein TCP-Socket) und das internen Unicode Format (oder umge herum), ist irgendeine Form der Kodierung beteiligt.

Siehe utf-8-vs-unicode, insbesondere Jon Skeet's Antwort, mit dem Verweis auf Joels Artikel The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

+0

Joel's Artikel war der Grund, warum ich beschloss, über Encoding nachzudenken, anstatt blind nur ASCII zu verwenden: p –

+0

Denken Sie daran, UTF-8 oder sogar UTF-16 ist kein Unicode. – gimel