ReceiveHTTPFile und Umlaute

Anfängerfragen zum Programmieren mit PureBasic.
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

ReceiveHTTPFile und Umlaute

Beitrag von Angelo »

Hallo,
ich kann den Befehl ReceiveHTTPFile() erfolgreich benutzen, sofern die Datei, die man erhalten will, keine Umlaute und kein"ß" enthält. Wenn dies aber der Fall ist, dann passiert nichts. Geht das mit Umlauten generell nicht, oder kann man da etwas über irgendeine Einstellung machen? Kann mir jemand helfen?
PB 5.50; Win 7
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ReceiveHTTPFile und Umlaute

Beitrag von ts-soft »

Haste den URLEncoder probiert?

Code: Alles auswählen

InitNetwork()
ReceiveHTTPFile(URLEncoder("http://www.internet.com/meine dateien/daß prügrüm.exe"), GetTemporaryDirectory() + "das program.exe")
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ReceiveHTTPFile und Umlaute

Beitrag von al90 »

Oder vllt. über API ? (Nicht getestet)

Code: Alles auswählen

Procedure.l DownloadFile(url$, file$, UseAPI.l=#False)

  Protected state.l = #False

  If UseAPI=#True
    If URLDownloadToFile_(0, url$, file$, 0, 0)=#S_OK
      state=#True
    EndIf
  Else
    If ReceiveHTTPFile(url$, file$)<>#NULL
      state=#True
    EndIf
  EndIf

ProcedureReturn state

EndProcedure
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: ReceiveHTTPFile und Umlaute

Beitrag von Angelo »

@ts-soft, al90:
Das habe ich noch nicht probiert. Ich kann das leider erst morgen testen, weil diese "Umlautdateien" in unserem betriebseigenen Netz stehen. Aber jetzt habe ich doch Hoffnung, dass es klappt mit den Umlauten. Melde mich morgen nach dem Testen! - Danke!!
PB 5.50; Win 7
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: ReceiveHTTPFile und Umlaute

Beitrag von Angelo »

Der Test verlief leider negativ. Aber etwas Interessantes habe ich festgestellt. Die Datei "bär.doc" wird durch URLEncoder() umgewandet in "b%E4r.doc". Wenn ich aber diese Datei mithilfe des Browsers im Netz aufsuche, sie mit der rechten Maustastse (ich rede hier über WindowsXP) anklicke, aus dem Kontext-Menü "Link-Adresse kopieren" auswähle und dann diese Adresse in die IDE von PB einfüge, dann ergibt sich für den Teil "bär.doc" Folgendes: "b%c3%a4r.doc". Gibt es für diese unterschiedliche Darstellung von "bär.doc" eine Erklärung??

Wenn ich die Darstellung "b%c3%a4r.doc" direkt verwende (also in den ReceiveHTTPFile-Befehl ohne vorgeschaltetem URLEncoder() reinschreibe), dann klappt es. Die Frage ist jetzt nur, wie kann ich diese Darstellung einer "Umlautdatei" automatisiert hinkriegen und nicht per Hand, wie jetzt in diesem Beispiel.
PB 5.50; Win 7
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: ReceiveHTTPFile und Umlaute

Beitrag von Angelo »

Ich hab's "zu Fuß" gemacht: (nicht elegant, aber es funktioniert)

Code: Alles auswählen

If FindString(datei$, "ä", 1) > 0
   datei$ = ReplaceString(datei$, "ä", "%c3%a4")
EndIf
If FindString(datei$, "ö", 1) > 0
   datei$ = ReplaceString(datei$, "ö", "%c3%b6")
EndIf
If FindString(datei$, "ü", 1) > 0
   datei$ = ReplaceString(datei$, "ü", "%c3%bc")
EndIf
If FindString(datei$, "ß", 1) > 0
   datei$ = ReplaceString(datei$, "ß", "%c3%9f")
EndIf
If FindString(datei$, " ", 1) > 0
   datei$ = ReplaceString(datei$, " ", "%20")
EndIf
PB 5.50; Win 7
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: ReceiveHTTPFile und Umlaute

Beitrag von helpy »

Ein kleiner Hinweis:

%E4 ist die URL-Codierung von "ä" im ASCII-Format
%C3%A4 ist die URL-Codierung von "ä" im UTF-8 Format

Zitat aus Wikipedia:
Auch für die Zeichen, die nicht im ASCII-Zeichensatz enthalten sind, werden die Bytes mit vorangestelltem % kodiert. Welche Bitfolge ein Zeichen jedoch darstellt, hängt von der zu benutzenden Zeichenkodierung ab. Es wird zwar vom RFC 3986 empfohlen, UTF-8 zur Kodierung zu benutzen, da dieses Unicode-Format für alle internationalen Zeichen benutzt werden kann, was UTF-8 zwar zur Quasi-Standardkodierung für URIs macht, aber einen expliziten Standard gibt es noch nicht. Um die URL kodieren zu können, muss man also wissen oder ahnen, welche Zeichenkodierung für die abzurufende Datei benutzt wurde oder welche Kodierung der Zielrechner benutzt. Aus diesem Grund ist es immer noch sinnvoll, nur auf Zeichen aus dem ASCII-Vorrat zurückzugreifen.

n der empfohlenen Kodierung UTF-8 wäre der Buchstabe ö (mit dem Unicode-Zeichenwert 246) als %C3%B6 dargestellt. Alle Zeichenwerte über 127 werden in zwei, drei oder vier Byte-Werten repräsentiert und dem entsprechend in die %-Kodierung übernommen; wobei alle üblichen Schriftzeichen mit zwei Bytes repräsentiert werden, mehr Bytes benötigen lediglich ungebräuchliche Zeichen sowie Markierungen der Richtungsumkehr.

Meist wird immer noch ISO 8859-1 (Latin-1) für die Darstellung benutzt und dessen identischer Zeichenwert 246 (Dezimal) direkt mit Hilfe der %-Kodierung in die URL eingefügt. Der Umlaut ö wird dann als Wert %F6 dargestellt.

Beide Darstellungsarten liefern dem Server aber eine andere Bitfolge. Obwohl beide nach ihrer Art richtig kodiert sind, liefert nur eine davon die gewünschte Datei und die andere meist nur eine Fehlermeldung. Bei einigen Servern – wie zum Beispiel die der Wikipedia – wird jedoch versucht, die Kodierung zu ermitteln, um dann auf die richtige Datei weiterleiten zu können. Wenn es mit einer Kodierung nicht klappt, sollte man eine der anderen wahrscheinlichen Varianten probieren.
cu, helpy
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

URLEncoderUTF8() // Bug in URLEncoder() ????

Beitrag von helpy »

Und noch was ;-) :

Code: Alles auswählen

Procedure.s URLEncoderUTF8( URL$ )
	Protected *memory, *UTF8.Ascii, EncodedURL$, Encode, xEncode
	
	*memory = AllocateMemory( Len(URL$) * 4 + 1 )
	*UTF8 = *memory

	If *UTF8
		PokeS( *UTF8, URL$, -1, #PB_UTF8 )
		
		While *UTF8\a
			Select *UTF8\a
				Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), Asc("-"), Asc("_"), Asc("."), Asc("~")
					; Keine Codierung
					EncodedURL$ + chr(*UTF8\a)
				Default
					; URL Codierung
					EncodedURL$ + "%" + Hex(*UTF8\a, #PB_Ascii)
			EndSelect
			
			*UTF8 + 1
		Wend
		
		FreeMemory( *memory )
	EndIf
	
	ProcedureReturn EncodedURL$	
EndProcedure
Diese Funktion unterscheidet sich jedoch nicht nur in der Codierung (UTF-8 anstatt ASCII) von der PB-Funktion URLEncoder():

Code: Alles auswählen

Debug URLEncoder( "http://www.test.de/hallo/test_ä.doc" )
; Das ergibt:  http://www.test.de/hallo/test_%E4.doc

; Meine Funktion dagegen ergibt: http%3A%2F%2Fwww.test.de%2Fhallo%2Ftest_%C3%A4.doc
Es gibt jedoch Fälle, wo man auch "/" (und andere Zeichen) codieren und per URL übergeben möchte. In diesem Fall würde die PB-Funktion versagen!

==> Würdet Ihr das nun als Bug bezeichnen ... oder als Feature ;-) ???

cu, helpy
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten