UTF-8 URI Unescape

Anfängerfragen zum Programmieren mit PureBasic.
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

UTF-8 URI Unescape

Beitrag von tyty »

Kennt jemand eine API-Funktion oder hat einen Code parat, um eine solche URI zu dekodieren?

Der%20Fr%C3%BChling%20Aus%20_Die%20Vier%20Jahres.mp3

Mit Urlunescape_ geht es nicht, da diese das %C3%BC als zwei Zeichen interpretiert.
Little John

Beitrag von Little John »

Code: Alles auswählen

name$ = URLDecoder("Der%20Fr%C3%BChling%20Aus%20_Die%20Vier%20Jahres.mp3")
Debug PeekS(@name$, -1, #PB_UTF8)
getestet mit PB 4.30

Gruß, Little John
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

Danke, aber das funktioniert im Unicode-Modus nicht.
Bild
Little John

Beitrag von Little John »

tyty hat geschrieben:Danke, aber das funktioniert im Unicode-Modus nicht.
Sorry, aber "funktioniert nicht" ist keine hilfreiche Fehlerbeschreibung.
Was passiert denn genau, wenn Du o.g. Code ausführst?

Gruß, Little John
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

Es wird lediglich ein "D" ausgegeben.
Bild
Little John

Beitrag von Little John »

In der Hilfe zu PeekS() steht in Bezug auf das Flag #PB_UTF8:
Liest den String als UTF8 (das Programm kann sowohl im Unicode- als auch im ASCII-Modus sein)
Da es hier offenbar nicht egal ist ob das Programm im Unicode-Modus compiliert wird oder nicht, handelt es sich IMHO um einen Bug in PB.

Gruß, Little John
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

Gibt es dafuer denn evtl. noch eine andere Moeglichkeit?
Bild
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Das Problem liegt nicht bei PeekS() sondern daran, dass beim dekodieren mit URLDecoder jedes "%xx" als EIN Zeichen behandelt und entsprechend im Zielstring (name$) abgelegt wird.

Wird die Source im Ascii Modus kompiliert, funktiniert das Lesen mit PeekS(), weil das Ergebnis als UTF-8 interpretiert werden kann!

Wird die Source im Unicode Modus kompiliert, wird das Unicode-Zeichen "%C3%BC" in die beiden Zeichen "%C3" und "%BC" zerlegt und entsprechend im Zielstring als Unicode String als ZWEI Zeichen abgelegt. D.h. im Unicode Modus muss dieser Zielstring zuerst zurück nach Ascii konvertiert und dann als UTF-8 gelesen werden!

Bsp:

Code: Alles auswählen

uri.s = "Der%20Fr%C3%BChling%20Aus%20_Die%20Vier%20Jahres.mp3"
tmp.s = URLDecoder(uri)
CompilerIf #PB_Compiler_Unicode
	tmpa.s = Space(Len(tmp))
	PokeS( @tmpa, tmp, -1, #PB_Ascii)
	name.s = PeekS(@tmpa, -1, #PB_UTF8)
CompilerElse
	name.s = PeekS(@tmp, -1, #PB_UTF8)
CompilerEndIf
Debug name
Das hat bei mir in beiden Compiler-Modi (Ascii und Unicode) funktioniert.

cu, guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

Vielen Dank, das funktioniert bei mir soweit einwandfrei.
Ich bin leider noch nicht ganz wunschlos gluecklich, denn mit noch exotischeren non-ASCII Zeichen klappt es leider nicht mehr ganz:
Bei %e9%9f%b3%e6%a5%bd zum Beispiel wird das zweite Zeichen 楽 angezeigt, das erste 音 ergibt jedoch 3 Fragezeichen.
Und wenn ich das ganze auf einem japanischen PC ausprobiere, klappt es ohnehin nicht. :|
Bild
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Kann es sein, dass die zur Anzeige verwendete Schriftart auf Deinem PC diese Zeichen nicht enthält?
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten