Ich will "ä" posten und es kommt "ä" an!!!
-
Hi!
Ich hab folgendes Problem: Ich benutze folgende Funktion, um Strings zu einem Server zu Posten:Public Function PostString(ByVal data As String, byval url as String) Dim postdata As String Dim myWriter As StreamWriter = Nothing Dim SomeBytes() As Byte Dim UrlEncoded As New StringBuilder Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)} webrequest = WebRequest.Create(url) Dim r As Stream = File.Open(application.StartupPath & "\Data\session.swd", FileMode.Open, FileAccess.Read) Dim c As New BinaryFormatter cookie = CType(c.Deserialize(r), CookieContainer) r.Close() webrequest.CookieContainer = cookie webrequest.Credentials = CredentialCache.DefaultCredentials webrequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*" webrequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705;)" webrequest.Method = "POST" postdata = data If postdata <> Nothing Then Dim i As Integer = 0 Dim j As Integer While i < postdata.Length j = postdata.IndexOfAny(reserved, i) If j = -1 Then UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, postdata.Length - i))) Exit While End If UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, j - i))) UrlEncoded.Append(postdata.Substring(j, 1)) i = j + 1 End While SomeBytes = System.Text.Encoding.UTF8.GetBytes(UrlEncoded.ToString()) webrequest.ContentLength = SomeBytes.Length else webrequest.ContentLength = 0 End if webrequest.ContentType = "application/x-www-form-urlencoded" postdata = data Dim requestStream As Stream = webrequest.GetRequestStream() requestStream.Write(SomeBytes, 0, SomeBytes.Length) requestStream.Close() webresponse = webrequest.GetResponse streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF7) Dim txt As String = streamreader.ReadToEnd.Trim streamreader.Close() webresponse.Close() Return txt End Function
Wenn ich aber Umlaute Poste (ä,ü,ö), dann kommen nur solche Sachen an:
"ä"
Woran kann das liegen?
Was für ein Mist mit diesen Encodings. Warum kann man nicht einfach den alten Tabellen wegsschmeissen und nur eine einzige benutzen?Christoph
-
Nimm Encoding.Default
-
Hab jetzt folgenden Code Verwendet:
Public Function PostString(ByVal data As String, byval url as String) Dim postdata As String Dim myWriter As StreamWriter = Nothing Dim SomeBytes() As Byte Dim UrlEncoded As New StringBuilder Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)} webrequest = WebRequest.Create(url) Dim r As Stream = File.Open(application.StartupPath & "\Data\session.swd", FileMode.Open, FileAccess.Read) Dim c As New BinaryFormatter cookie = CType(c.Deserialize(r), CookieContainer) r.Close() webrequest.CookieContainer = cookie webrequest.Credentials = CredentialCache.DefaultCredentials webrequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*" webrequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705;)" webrequest.Method = "POST" postdata = data If postdata <> Nothing Then Dim i As Integer = 0 Dim j As Integer While i < postdata.Length j = postdata.IndexOfAny(reserved, i) If j = -1 Then UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, postdata.Length - i))) Exit While End If UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, j - i))) UrlEncoded.Append(postdata.Substring(j, 1)) i = j + 1 End While SomeBytes = System.Text.Encoding.Default.GetBytes(UrlEncoded.ToString()) webrequest.ContentLength = SomeBytes.Length else webrequest.ContentLength = 0 End if webrequest.ContentType = "application/x-www-form-urlencoded" postdata = data Dim requestStream As Stream = webrequest.GetRequestStream() requestStream.Write(SomeBytes, 0, SomeBytes.Length) requestStream.Close() webresponse = webrequest.GetResponse streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF7) Dim txt As String = streamreader.ReadToEnd.Trim streamreader.Close() webresponse.Close() Return txt End Function
Kommt aber leider immer noch dasselbe.
Christoph
-
Du machst folgendes:
streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF7)
Du weißt, was UTF7 ist? Das entspricht dem ASCII-Code, also den ersten 127 Zeichen. Dort gibts keine deutschen Umlaute. Versuch es mal mit UTF8. Damit sollte es klappen.
Was auch nützlich sein könnte:
webrequest.Headers.Set("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" & vbNewLine) webrequest.Headers.Set("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" & vbNewLine)
Damit gibst Du dem Server bekannt, was Du gerne empfangen würdest...
-
Also ich benutze den Code, um Daten auf der Ebay Webseite zu posten. Zum beispiel die Artikelbeschreibung.
Wenn ich
streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF8)
Anstatt
streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF7)
benutze, dann werden zwar die Umlaute, die ich zu Ebay hingeschickt habe richtig angezeigt (ich benutze IE Control zum Anzeigen der Serverantwort), aber der Rest der Umlaute, die so auf der Ebay Webseite stehen, sind einfach weg. Und wenn ich das Angebot einstelle, und mir das Ergebnis mit Firefox ansehe, ist wieder alles, als wenn ich
StreamReader(webresponse.GetResponseStream,Encoding.UTF8)
benutze,
was für mich auch verständlich ist. Der Code oben ist ja auch nur zum anzeigen der Antwort. Ich vermute, dass der Wurm irgedwo davor steckt.Irgendwie kommen die Sachen schon falsch encodiert da an...
webrequest.Headers.Set("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" & vbNewLine) webrequest.Headers.Set("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" & vbNewLine)
hat leider auch nichts bewirkt.
Ich verstehe das nicht. Nach meiner Funktion müsste doch UTF-8 da ankommen. Und normalerweise müsste der Ebay Server das doch auch akzeptieren.
Es ist so, als wenn man etwas zum Beispiel in UTF-8 in ein deutsche Gästebuch postet, aber wenn man die Seite mit dem Browser aufruft, sieht man wieder nur
"ä".Ganz schön frustrierend (HILFE <- :()
Hier ist der aktuelle Code:
Public Function PostString(ByVal data As String, byval url as String) Dim postdata As String Dim myWriter As StreamWriter = Nothing Dim SomeBytes() As Byte Dim UrlEncoded As New StringBuilder Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)} webrequest = WebRequest.Create(url) Dim r As Stream = File.Open(application.StartupPath & "\Data\session.swd", FileMode.Open, FileAccess.Read) Dim c As New BinaryFormatter cookie = CType(c.Deserialize(r), CookieContainer) r.Close() webrequest.CookieContainer = cookie webrequest.Credentials = CredentialCache.DefaultCredentials webrequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*" webrequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705;)" webrequest.Headers.Set("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" & vbNewLine) webrequest.Headers.Set("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" & vbNewLine) webrequest.Method = "POST" postdata = data If postdata <> Nothing Then Dim i As Integer = 0 Dim j As Integer While i < postdata.Length j = postdata.IndexOfAny(reserved, i) If j = -1 Then UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, postdata.Length - i))) Exit While End If UrlEncoded.Append(HttpUtility.UrlEncode(postdata.Substring(i, j - i))) UrlEncoded.Append(postdata.Substring(j, 1)) i = j + 1 End While SomeBytes = System.Text.Encoding.UTF8.GetBytes(UrlEncoded.ToString()) webrequest.ContentLength = SomeBytes.Length else webrequest.ContentLength = 0 End if webrequest.ContentType = "application/x-www-form-urlencoded" postdata = data Dim requestStream As Stream = webrequest.GetRequestStream() requestStream.Write(SomeBytes, 0, SomeBytes.Length) requestStream.Close() webresponse = webrequest.GetResponse streamreader = New StreamReader(webresponse.GetResponseStream,Encoding.UTF8) Dim txt As String = streamreader.ReadToEnd.Trim streamreader.Close() webresponse.Close() Return txt End Function
-
Mach doch aus z.B. "ä" vorher nen "ä"
http://de.selfhtml.org/html/allgemein/zeichen.htm#umlaute
Damit müsste man dem Zeichensatz-Problem aus dem Weg gehen können...