vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
CURL 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CURL string Sonderzeichen und Umlaute 
Autor: Preisser
Datum: 16.03.11 23:40

Hallo,

kein Problem. Allerdings solltest du die Zeile
Dim 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel