| |
VB.NET - Ein- und UmsteigerCURL string Sonderzeichen und Umlaute | | | Autor: krebsi83 | Datum: 16.03.11 14:03 |
| Hallo Leute!
ich möchte aus einem vb.net programm heraus eine Nachricht über meinen identi.ca-Account senden
Ich nutze hierfür das Tool curl.exe, welches ich über shell() aufrufe.
Das funktioniert so ja schon ganz gut... aber.... wenn ich in meinem String nun Sondezeichen und Umlaute habe, werden die nicht gesendet. Ich denke mal, dass CURL die Daten als utf-8 konvertiert haben will, jedoch bekomme ich den string nicht nach utf-8
Hier mein Beispiel-Code (der Funktioniert, bis auf die Sonderzeichen/Umlaute)
Sub Button1Click(sender As Object, e As EventArgs)
Dim Username, Passwort, UpdateTXT As String
'identi.ca-Userdaten...
Username = "testuser"
Passwort = "123456789"
' String aus dem TExtfeld lesen....
UpdateTXT = txtDent.Text
'aufrufen von curl.exe
Shell("curl -u " + Username + ":" + Passwort + " -d status=" + Chr(34) + _
UpdateTXT + Chr(34) + " http://identi.ca/api/statuses/update.xml")
End Sub Hat jemand einen Tipp für mich?
VG
krebsi83
Beitrag wurde zuletzt am 16.03.11 um 14:04:27 editiert. | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: krebsi83 | Datum: 16.03.11 18:17 |
| Sooo... nach langem Rumwurschteln nun meine Lösung
Mit Hilfe dieser Cheat-Tabelle hier: http://bueltge.de/wp-content/download/wk/utf-8_kodierungen.pdf
habe ich mir eine kleine Funktion gebastelt die meinen String in UTF-8-Zeichen wandelt.
Funktioniert wunderbar!
Jetzt kann ich Umlaute & Co. aus meiner vb.net-Anwendung über curl.exe an identi.ca senden
Hier die Funktion, welche die Zeichen wandelt:
Function Str2UTF8(Text As String) As String
Text = Replace(Text, "à", "Ã ")
Text = Replace(Text, "Ä", "Ä")
Text = Replace(Text, "ä", "ä")
Text = Replace(Text, "Ç", "Ç")
Text = Replace(Text, "ç", "ç")
Text = Replace(Text, "É", "É")
Text = Replace(Text, "é", "é")
Text = Replace(Text, "ê", "ê")
Text = Replace(Text, "È", "È")
Text = Replace(Text, "è", "è")
Text = Replace(Text, "Ø", "Ø")
Text = Replace(Text, "ø", "ø")
Text = Replace(Text, "ö", "ö")
Text = Replace(Text, "Ö", "Ö")
Text = Replace(Text, "ß", "ß")
Text = Replace(Text, "Ü", "Ãœ")
Text = Replace(Text, "ü", "ü")
Text = Replace(Text, "ý", "ý")
Str2UTF8 = Text
End Function Die Funktion ist nicht ganz vollständig (einige UTF-8-Zeichen fehlen noch) siehe Cheat-Tabelle im Link (oben)...
Ich hoffe das Ding hilft noch jemanden
VG
krebsi83 | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: Preisser | Datum: 16.03.11 18:51 |
| Hallo,
wieso benutzt du für eine Funktionalität, die bereits in .Net enthalten ist, ein externes Programm? Es gibt doch in .Net diesen WebRequest oder so, mit dem man eine HTTP-Anfrage senden kann und die empfangenen Daten auslesen kann. Wenn du dann Parameter übergeben willst, kannst du dies entweder in der URL (nach dem "?") machen oder per POST. Eine Parameterliste bei Http hat ja das Format "Parameter1=Wert1&Parameter2=Wert2&..." Dazu müsstest die einzelnen Parameternamen und -werte immer URL-enkodieren (z.B. mit System.Web.HttpUtility.UrlEncode(), bei der man als Kodierung UTF-8 angeben kann).
Die von dir angegebene Funktion zum Kodieren von UTF-8 ist ein Beispiel, wie man es nicht machen sollte. UTF-8 ist eine Kodierung von Unicode-Zeichen nach Bytes. Hier werden aber einzelne Textzeichen in die Darstellung konvertiert, de man bekommen würde, wenn man UTF-8-Bytes als Windows-1252 auslesen würde. Man bekommt also wieder einen Unicode-String, der dann wohl zurück nach bytes über Ansi (Windows-1252) kodiert wird, was auf keinen Fall zuverlässig ist. Außerdem wird es durch mehrfaches Replace() auch noch sehr ineffizient, da für jedes Ersetzen ein neuer String angelegt werden muss.
Du solltest dir mal die System.Text.Encoding-Klasse in .Net ansehen, welche Funktionalitäten zum Konvertieren zwischen Bytes und String bietet.
Beitrag wurde zuletzt am 16.03.11 um 19:01:13 editiert. | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: krebsi83 | Datum: 16.03.11 23:23 |
| @Preisser danke für die Infos. Bin noch ein Frischling, was vb.net betrifft. Habe früher nur bash-Scripte und a bissl Python unter Linux gemacht... daher kannte ich curl ;)
Dein Post hat mir aber die richtigen Anstöße gegeben und mit a bissl search,try and error ist nun das Ergebnis raus gekommen:
Public Shared Sub PostDent(username As String, password As String, dent As _
String)
Try
Dim user As String = Convert.ToBase64String( _
System.Text.Encoding.UTF8.GetBytes(username & ":" & password))
Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("status=" & dent)
Dim request As HttpWebRequest = DirectCast(WebRequest.Create( _
"http://identi.ca/api/statuses/update.xml"), HttpWebRequest)
request.Method = "POST"
request.ServicePoint.Expect100Continue = False
request.Headers.Add("Authorization", "Basic " & user)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = bytes.Length
Dim reqStream As Stream = request.GetRequestStream()
reqStream.Write(bytes, 0, bytes.Length)
reqStream.Close()
Catch ex As Exception
End Try
End Sub THX und viele Grüße
krebsi83 | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: Preisser | Datum: 16.03.11 23:40 |
| Hallo,
kein Problem. Allerdings solltest du die ZeileDim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("status=" & dent) noch anpassen, denn hier wird ja eine Http-Parameterliste übergeben. Beispielsweise kann es so passieren, wenn in der Variable dent der String "bla&blubb" vorkommt, dass dann vom Server nur das "bla" erkannt, wird, da das "&" die Parameter trennt und einen zweiten Parameter einleitet. Stattdessen sollten die Parameter mit der UrlEncode()-Funktion kodiert werden. Diese kodiert Sonderzeichen und schon anderweitig belegte Zeichen (auch '&', '=' usw.) mit %nn (also im Hex-Format). Du solltest deshalb lieber z.B.
Dim bytes As Byte() = System.Text.Encoding.ASCII.GetBytes("status=" & _
System.Web.HttpUtility.UrlEncode(dent, System.Text.Encoding.UTF8)) schreiben. Damit die Klasse System.Web.HttpUtility verfügbar ist, sollte in den Projekteigenschaften (Kompilieren, erweiterte Einstellungen) als Target Framework das volle Framework ausgewählt sein (also nicht Client Profile beim FW 4) und du musst dann einen Verweis auf das System.Web-Assembly hinzufügen (im Menü "Projekt", "Verweis hinzufügen..."). Dann werden alle Zeichen richtig für die Verwendung in der URL (bzw. hier als POST-Anhang) kodiert.
Beitrag wurde zuletzt am 16.03.11 um 23:44:26 editiert. | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: krebsi83 | Datum: 17.03.11 00:12 |
| Hallo, so spät noch wach?
Du hast recht bla&blubb ergibt nur bla
Ich habe es mit deinem Code-Schnipsel probiert und auch das volle Framework ausgewählt, aber den Verweis kann ich irgenwie nicht hinzufügen.... Ich arbeite nicht mit Visual Studio, sondern mit Sharpdevelop....
Bekomme also immer folgende Fehlermeldung:
"HttpUtility" ist kein Member von "Web". (BC30456) | |
Re: CURL string Sonderzeichen und Umlaute | | | Autor: krebsi83 | Datum: 17.03.11 00:51 |
| @Preisser
Hab es jetzt geschafft den System.Web-Assembly hinzuzufügen
Vielen Dank! Jetzt klappte es auch mit dem "&"
Na dann... gute Nacht!
krebsi83 | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos
|