Web-UTF-8
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Web-UTF-8
Laßt Euch nicht von der merkwürdogen Überschrift irritieren ...
Worum es mir geht: Ich muß per LoadFromUrl (Xbase++-Version, nicht die von Phil) Strings ins Internet senden. Die müssen UTF-8 sein. Ansich kein Problem, ich habe eine Funktion, die mir ANSI nach UTF-8 übesetzt. So wird z. B. aus "ü" ein "ü". Aber um das ins Web zu senden brauche ich das nicht, sondern das muß "%C3%BC" heißen.
Welche Funktion schreibt mir das? In PHP gibt es dafür wohl die Funktion url_encode, aber in Xbase++ gibt es das wohl eher nicht. Soweit ist Xbase++ dann doch noch nicht im Web angekommen ...
Jan
Worum es mir geht: Ich muß per LoadFromUrl (Xbase++-Version, nicht die von Phil) Strings ins Internet senden. Die müssen UTF-8 sein. Ansich kein Problem, ich habe eine Funktion, die mir ANSI nach UTF-8 übesetzt. So wird z. B. aus "ü" ein "ü". Aber um das ins Web zu senden brauche ich das nicht, sondern das muß "%C3%BC" heißen.
Welche Funktion schreibt mir das? In PHP gibt es dafür wohl die Funktion url_encode, aber in Xbase++ gibt es das wohl eher nicht. Soweit ist Xbase++ dann doch noch nicht im Web angekommen ...
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
du meinst du willst ein "ausgefülltes" HTML Dokument per POST senden (bzw. das Ausfüllen simmulieren) in der ASINET gibt es dazu eine Funktion ...
ich denke es ist das was du brauchst.
Ansonsten habe ich sowas auch mal selbst geschrieben, alle nicht ASCII (7-Bit) werden als %xx verschlüsselt, wobei xx chr(nn) => HEX(nn) ist.
Die Funktion HEX() kennt Xbase zwar nicht, aber wenn nötig kann ich das finden.
Code: Alles auswählen
GetCgiString( <oHtmlFormElement> ) --> cCgiString
Ansonsten habe ich sowas auch mal selbst geschrieben, alle nicht ASCII (7-Bit) werden als %xx verschlüsselt, wobei xx chr(nn) => HEX(nn) ist.
Die Funktion HEX() kennt Xbase zwar nicht, aber wenn nötig kann ich das finden.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Hubert,
leider habe ich kein oHtmlFormElement. Nur einen ANSI-String.
Ich glaub ich steh da ganz enorm auf dem Schlauch ... Sorry.
Jan
leider habe ich kein oHtmlFormElement. Nur einen ANSI-String.
Ich glaub ich steh da ganz enorm auf dem Schlauch ... Sorry.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
ich zeige mal ein Beispiel, welches aus einer HTML FORM erzeugt und übergeben wurde.
ist das so ein ANSI String ?
Code: Alles auswählen
Felder:
vorname: test
name: xyz
strasse: äöü ß
plz:
ort:
anmerkung:
extra: JAHR
senddata: Senden
REQUEST_METHOD: POST
CONTENT_LENGTH: 91
STDIN:
vorname=test&name=xyz&strasse=%E4%F6%FC %DF&plz=&ort=&anmerkung=&Extra=JAHR&SendData=Senden
STDIN-Original:
vorname=test&name=xyz&strasse=%E4%F6%FC+%DF&plz=&ort=&anmerkung=&Extra=JAHR&SendData=Senden
Code: Alles auswählen
vorname=test&name=xyz&strasse=%E4%F6%FC+%DF&plz=&ort=&anmerkung=&Extra=JAHR&SendData=Senden
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
den erstellt man z.B. mit der genannten Funktion aus HTML Elementen
<input ...>
wenn die Funktion nicht passt, hier ist der Code des empfangenden Programmes,
das Gegenteil erstellt aus einem normalen ANSI String in einen so codierten,
ob ich die habe weiß ich nicht, sollte aber leicht umsetzbar sein.
<input ...>
wenn die Funktion nicht passt, hier ist der Code des empfangenden Programmes,
das Gegenteil erstellt aus einem normalen ANSI String in einen so codierten,
ob ich die habe weiß ich nicht, sollte aber leicht umsetzbar sein.
Code: Alles auswählen
*-----------------------------------------------------------------------
function CGI_DeCode(cString) // codiertes Feld in lesbare Zeichen dekodieren.
// man könnte Zeichen für Zeichen abarbeiten
// aber strTran ist schneller !
local cHex,cChar,x // auch bei sehr langen Strings, maximal 256 Durchgänge
cString := strTran(cString,"%25",chr(0)+chr(0)+chr(0)) // echte % Zeichen schützen
do while "%" $ cString
x := at("%",cString)
cHex := substr(cString,x,3) // %0A - 3 Zeichen
cChar := Hex2Asc(cHex) // ersetzen durch chr(10)
cString := strTran(cString,cHex,cChar)
enddo
cString := strTran(cString,chr(0)+chr(0)+chr(0),"%") // echte % Zeichen zurücksetzen
return cString
*-----------------------------------------------------------------------
FUNCTION Umlaut2Html(cTxt) // Umlaute müssen in HTML spezialcodes umgesetzt werden.
cTxt := strTran(cTxt,"ä","ä")
cTxt := strTran(cTxt,"ö","ö")
cTxt := strTran(cTxt,"ü","ü")
cTxt := strTran(cTxt,"Ä","Ä")
cTxt := strTran(cTxt,"Ö","Ö")
cTxt := strTran(cTxt,"Ü","Ü")
cTxt := strTran(cTxt,"ß","ß")
cTxt := strTran(cTxt,"²","²")
cTxt := strTran(cTxt,"³","³")
cTxt := strTran(cTxt,"°","°")
* cTxt := strTran(cTxt,chr(34),""") // das gäbe Fehler im HTML Aufbau !
* cTxt := strTran(cTxt,"&","&")
* cTxt := strTran(cTxt,"<","<") // das gäbe Fehler im HTML Aufbau !
* cTxt := strTran(cTxt,">",">") // das gäbe Fehler im HTML Aufbau !
cTxt := strTran(cTxt,"|","¦")
return cTxt // Bei fehlerhafter Anzeige werden weitere nötig
*-----------------------------------------------------------------------
FUNCTION Hex2Asc(cHex) // CGI-HEX Format z.B.: %1F nach chr() umsetzen
LOCAL nHigh,nLow
LOCAL cChar
LOCAL cHigh,cLow
cHigh := substr(cHex,2,1)
cLow := substr(cHex,3,1)
IF cHigh >= "A" .AND. cHigh <= "F"
nHigh := ASC(cHigh)-55
ELSE
nHigh := VAL(cHigh)
END IF
IF cLow >= "A" .AND. cLow <= "F"
nLow := ASC(cLow)-55
ELSE
nLow := VAL(cLow)
END IF
cChar = CHR(nHigh*16+nLow)
return cChar
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
hier ist das gleiche Problem angesprochen und dort steht auch der Name "URL-ENCODE" ...
http://www.xbaseforum.de/viewtopic.php? ... 848#p39613
http://www.xbaseforum.de/viewtopic.php? ... 848#p39613
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Hubert,
eine Menge Antworten ...
Erstmal Deine letzte: Das hilft mir leider nicht weiter, denn die Funktion von Phil hat einen Parameter, wo man den Content-Type angebenen kann. Aber nicht die Alaska-Funktion. Ich hab mir die englische Hilfe von Alaska 2x durchgelesen, und verstehe keinen der Paramater entsprechend.
Deine Vorletzte: Ich kann mit dem Code so erstmal nichts anfangen. Was genau soll der machen? Die Geschichte mit dem StrTran(cString, "ä", "&aauml") kenne ich, und verwende die auch an anderer Stelle. Aber das hilft hier in diesem Fall ja leider nichts.
Und Deine erste auf meine erste Antwort: Ja, so ähnlich sieht mein String aus.
Jan
eine Menge Antworten ...
Erstmal Deine letzte: Das hilft mir leider nicht weiter, denn die Funktion von Phil hat einen Parameter, wo man den Content-Type angebenen kann. Aber nicht die Alaska-Funktion. Ich hab mir die englische Hilfe von Alaska 2x durchgelesen, und verstehe keinen der Paramater entsprechend.
Deine Vorletzte: Ich kann mit dem Code so erstmal nichts anfangen. Was genau soll der machen? Die Geschichte mit dem StrTran(cString, "ä", "&aauml") kenne ich, und verwende die auch an anderer Stelle. Aber das hilft hier in diesem Fall ja leider nichts.
Und Deine erste auf meine erste Antwort: Ja, so ähnlich sieht mein String aus.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Schick mir doch mal so einen String per PN und ich sehe welche Funktion du brauchst
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Hubert,
ist raus.
Jan
ist raus.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: Web-UTF-8
Hallo, Jan -
OT4XB, und die Funktion heisst cAnsiToUtf8().
OT4XB, und die Funktion heisst cAnsiToUtf8().
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Georg,
leider nein. Eine Konvertierungsfunktion nach UTF-8 habe ich bereits. Die hab ich im Quellcode vorliegen und nutze die an anderer Stelle auch. Aber hier hilft das nicht weiter. Lies mal mein Eingangsposting, da steht das drin.
Jan
leider nein. Eine Konvertierungsfunktion nach UTF-8 habe ich bereits. Die hab ich im Quellcode vorliegen und nutze die an anderer Stelle auch. Aber hier hilft das nicht weiter. Lies mal mein Eingangsposting, da steht das drin.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Ich habe es probiert, die ASINET Funktion functioniert tatsächlich nur mit von LoadFromUrl() geladenen Formularen.
Du mußt also den Konverter selbst bauen. Hierbei ist es wichtig, die Feldnamen, Feldinhalten und den Rest zu trennen, da Feldinhalte bei speziellen Zeichen (allen RESERVIERTEN) mit %xx ersetzt werden müssen, dabei aber die Steuerzeichen zwischen den Feldern nicht verändert werden dürfen, daher kann man nicht einfach mit StrTran() über den kompletten String gehen, sondern muss das zusammenbauen !
Ob der FELDINHALT mit ANSI oder UTF-8 kodiert werden muss, ist NICHT GENORMT, aber wichtig.
Hier steht wie es geht
http://de.wikipedia.org/wiki/URL-Encoding
Ich habe mal eine Funktion gebaut, die das erledigen sollte bzw. 3 da die HEX Umwandlung auch noch nötig war.
Nach meinem Test funktioniert es
Hier die Testergebnisse, wobei die Anzeige im CRT Fenster natürlich die Umlaute falsch anzeigt.
Die Protokolldatei in Ansi ist aber OK:
Falls du UTF-8 liefern musst, musst du halt die Feldinhalte etwas anders umsetzen.
Du mußt also den Konverter selbst bauen. Hierbei ist es wichtig, die Feldnamen, Feldinhalten und den Rest zu trennen, da Feldinhalte bei speziellen Zeichen (allen RESERVIERTEN) mit %xx ersetzt werden müssen, dabei aber die Steuerzeichen zwischen den Feldern nicht verändert werden dürfen, daher kann man nicht einfach mit StrTran() über den kompletten String gehen, sondern muss das zusammenbauen !
Ob der FELDINHALT mit ANSI oder UTF-8 kodiert werden muss, ist NICHT GENORMT, aber wichtig.
Hier steht wie es geht
http://de.wikipedia.org/wiki/URL-Encoding
Ich habe mal eine Funktion gebaut, die das erledigen sollte bzw. 3 da die HEX Umwandlung auch noch nötig war.
Nach meinem Test funktioniert es
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#define CRLF chr(13)+chr(10)
#pragma Library( "ASINet10.lib" )
procedure main()
local aFelder, cString := "XYZURL?" // zwischen URL und Parameter kommt ein "?"
set charset to ansi
set alternate to Protokoll.txt
set alternate on
// da ich hier im Quellcode eingebe, habe ich %22 anstatt " getippt.
// in einer SLE oder Variable kann man auch " eingeben oder chr(34) ...
aFelder := {{"name",["Hans Müller"]},;
{"plz", "73213"},;
{"Ort", ["Oststraße 15 äöü ~ + %"] } }
cString := MyUrlEncode(cString, aFelder)
? "URL:"
? cString
wait
return
*----------------------------------------------------
function MyUrlEncode(cString, aFelder)
? "URL:"
? cString
for i := 1 to len(aFelder)
? "Feld",i,aFelder[i,1],aFelder[i,2]
? " => ",i,aFelder[i,1],MyAnsiEncode(aFelder[i,2])
if i > 1
cString += "&"
endif
cString += aFelder[i,1] + "=" + MyAnsiEncode(aFelder[i,2])
next
return cString
*----------------------------------------------------
function MyAnsiEncode(cIn) // nur mit Feld-INHALT-aufrufen !
local i, nLen, cOut := ""
nLen := len(cIn)
for i := 1 to nLen
if cIn[i] $ " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
if cIn[i] == " "
cOut += "+"
else
cOut += cIn[i]
endif
else
cOut += "%" + NumToHex( ASC(cIn[i]), 2 )
endif
next
return cOut
*----------------------------------------------------
function NumToHex(nWert,nLen)
// Formel kann man unter www.wikipedia.de -> Hexadezimalsystem nachlesen.
local cHex := "", x
local cH := "0123456789ABCDEF"
DEFAULT nLen TO 0
do while .t.
x := nWert % 16 // Divisionsrest ergibt HEX-Ziffer der höchsten Stelle
cHex := cH[x+1]+cHex // Rest 0 -> "0", da dies aber das 1. Zeichen im String ist +1
nWert := int(nWert/16) // nächste Potenz prüfen.
if nWert <= 0
exit
endif
enddo
if nLen > 0
cHex := Replicate("0",nLen-len(cHex))+cHex
endif
return cHex
*----------------------------------------------------
function HexToNum(cHex)
local x,y,nLenX,i,nWert,cH
i := 0 // Erste Stelle 16^i == 16^0
cH := "123456789ABCDEF" // "0"-"F" -> in Zahl umsetzen, wobei AT() "0" -> 0 ergibt
nLenX := len(cHex) // Länge des HEX-Strings ergibt die Anzahl an Stellen
nWert := 0 // hier wird der Wert addiert
for x := nLenX TO 1 STEP -1
y := AT(cHex[x],cH) // "0" -> 0, "1" -> 1 ... "F" -> 15
nWert += y * 16^i // Wert dieser Stelle addieren
i++ // Index erhöhen ...
next
return int(nWert)
Die Protokolldatei in Ansi ist aber OK:
Code: Alles auswählen
URL:
XYZURL?
Feld 1 name "Hans Müller"
=> 1 name %22Hans+M%FCller%22
Feld 2 plz 73213
=> 2 plz 73213
Feld 3 Ort "Oststraße 15 äöü ~ + %"
=> 3 Ort %22Oststra%DFe+15+%E4%F6%FC+%7E+%2B+%25%22
URL:
XYZURL?name=%22Hans+M%FCller%22&plz=73213&Ort=%22Oststra%DFe+15+%E4%F6%FC+%7E+%2B+%25%22
Press any key to continue...
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: Web-UTF-8
Hallo, Jan -
und es ist immer wieder das gleiche Problem mit Dir, Deine Beschreibung ist nicht aussagekräftig. Was willst Du machen? Z.B. POST-Operationen durchführen?
Ich habe für POST-Operationen eine Tabelle und eine Funktion, die die Übersetzung vornimmt:
Die Tabelle selbst liegt in einer MySQL-Datenbank, die ich zur Laufzeit lade. Damit übersetze ich dann die Zeichen. Es hat sich bei mir gezeigt, dass eben immer mal wieder was dazukommt, was ich dann aufnehme. Bevor ich das auf MySQL umgestellt habe, war die Tabelle im Quellcode des Programms:
Vielleicht hilft Dir das ja weiter?
Und wenn's nicht POST war, ignoriere diesen Beitrag einfach ...
und es ist immer wieder das gleiche Problem mit Dir, Deine Beschreibung ist nicht aussagekräftig. Was willst Du machen? Z.B. POST-Operationen durchführen?
Ich habe für POST-Operationen eine Tabelle und eine Funktion, die die Übersetzung vornimmt:
Code: Alles auswählen
FUNCTION Str2UniCoded(cString)
Local nI
FOR nI := 1 TO nUniCode
cString := StrTran(cString, aUniCode[nI, 1], aUniCode[nI, 2])
NEXT
RETURN (cString)
Code: Alles auswählen
aUniCode := {;
{Chr(037), "%25"},; // %
{Chr(036), "%24"},; // $
{Chr(038), "%26"},; // &
{Chr(064), "%40"},; // @
{Chr(129), "%C3%BC"},; // ü
{Chr(130), "%C3%A9"},; // é
{Chr(131), "%C3%A2"},; // â
{Chr(132), "%C3%A4"},; // ä
{Chr(133), "%C3%A0"},; // à
{Chr(134), "%C3%A5"},; // å
{Chr(135), "%C3%A7"},; // ç
{Chr(136), "%C3%AA"},; // ê
{Chr(137), "%C3%AB"},; // ë
{Chr(138), "%C3%A8"},; // è
{Chr(139), "%C3%AF"},; // ï
{Chr(142), "%C3%84"},; // Ä
{Chr(144), "%C3%89"},; // É
{Chr(147), "%C3%B4"},; // ô
{Chr(148), "%C3%B6"},; // ö
{Chr(153), "%C3%96"},; // Ö
{Chr(154), "%C3%9C"},; // Ü
{Chr(155), "%C3%B8"},; // ø
{Chr(157), "%C3%98"},; // Ø
{Chr(160), "%C3%A1"},; // á
{Chr(161), "%C3%AD"},; // í
{Chr(162), "%C3%B3"},; // ó
{Chr(163), "%C3%BA"},; // ú
{Chr(169), "%C2%AE"},; // ®
{Chr(170), ""},; // bedingter Zeilenumbruch
{Chr(174), "%C2%AB"},; // «
{Chr(175), "%C2%BB"},; // »
{Chr(208), "%C3%B0"},; // ð
{Chr(213), "%E2%82%AC"},; // €
{Chr(225), "%C3%9F"},; // ß
{Chr(239), "%C2%B4"},; // ´
{Chr(240), "%C2%AD"}; //
}
Und wenn's nicht POST war, ignoriere diesen Beitrag einfach ...
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Georg,
Abgesehen davon: Danke für die Tabelle. Ich hab mir selber eine geschrieben, aber da hab ich nur die Umlaute, ß, und Leerzeichen drin, kostet halt Zeit sowas zusammen zu tippen. Ich werd die anderen Zeichen aus Deiner Tabelle einfach mit reinkopieren. Lieber wäre mir aber eine Funktion, die das automatisch umsetzt, denn so schnell ein StrTran() auch ist - mehrere Dutzend davon kosten sicher mehr Zeit als eine C-Funktion oder ein API-Aufruf (wenn es denn so einen gäbe)
Jan
Was mehr soll ich schreiben als in meinem EingangspostingGeorg hat geschrieben:und es ist immer wieder das gleiche Problem mit Dir, Deine Beschreibung ist nicht aussagekräftig. Was willst Du machen? Z.B. POST-Operationen durchführen?
Das deckt sich mit Deiner Übersetzungstabelle, und damit ist die Antwort ja eigentlich klar.Jan hat geschrieben:So wird z. B. aus "ü" ein "ü". Aber um das ins Web zu senden brauche ich das nicht, sondern das muß "%C3%BC" heißen.
Abgesehen davon: Danke für die Tabelle. Ich hab mir selber eine geschrieben, aber da hab ich nur die Umlaute, ß, und Leerzeichen drin, kostet halt Zeit sowas zusammen zu tippen. Ich werd die anderen Zeichen aus Deiner Tabelle einfach mit reinkopieren. Lieber wäre mir aber eine Funktion, die das automatisch umsetzt, denn so schnell ein StrTran() auch ist - mehrere Dutzend davon kosten sicher mehr Zeit als eine C-Funktion oder ein API-Aufruf (wenn es denn so einen gäbe)
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Hubert,
Danke für die Mühe. Ich schau mir das mal näher an. Aber nicht mehr heute Abend Und ja, wie ich im Eingangsposting schrieb brauch ich UTF-8.
Der String, den ich Dir in der PN geschickt hatte, ist der Gesamtstring. Den ich zur Laufzeit aus Stringelementen und Variablen zusammen setze. Der problematische Teil ist der Variableninhalt, und den kann ich ja gesondert konvertieren, bevor ich den Gesamtstring zusammen setze. Damit umgehen ich dann das von Dir erwähnte Problem.
Jan
Danke für die Mühe. Ich schau mir das mal näher an. Aber nicht mehr heute Abend Und ja, wie ich im Eingangsposting schrieb brauch ich UTF-8.
Der String, den ich Dir in der PN geschickt hatte, ist der Gesamtstring. Den ich zur Laufzeit aus Stringelementen und Variablen zusammen setze. Der problematische Teil ist der Variableninhalt, und den kann ich ja gesondert konvertieren, bevor ich den Gesamtstring zusammen setze. Damit umgehen ich dann das von Dir erwähnte Problem.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Nicht ganz, eine Standard UTF-8 Konvertierung wird Blank nicht ändern, der URL encoded String braucht aber ein '+' statt einem Blank !
Meine obigen Funktionen müssen nur auf UTF-8 angepasst werden, wobei ich diese jetzt nicht vornehme, dafür kann aber georgs Tabelle oder deine normale Funktion herhalten:
... wie geschrieben, Georgs Array passt da bestens
Meine obigen Funktionen müssen nur auf UTF-8 angepasst werden, wobei ich diese jetzt nicht vornehme, dafür kann aber georgs Tabelle oder deine normale Funktion herhalten:
Code: Alles auswählen
*----------------------------------------------------
function MyUrlEncode(cString, aFelder) // die Testausgaben weglassen ...
for i := 1 to len(aFelder)
if i > 1
cString += "&"
endif
cString += aFelder[i,1] + "=" + MyUrl2Utf8Encode(aFelder[i,2]) // hier UTF-8 Konverter aufrufen, aber speziellen wegen dem Blank !!!!
next
return cString
*----------------------------------------------------
function MyUrl2Utf8Encode(cIn) // nur mit Feld-INHALT-aufrufen !
local i, nLen, cOut := ""
nLen := len(cIn)
for i := 1 to nLen
if cIn[i] $ " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" // das bleibt !
if cIn[i] == " "
cOut += "+"
else
cOut += cIn[i]
endif
else
cOut += "%" + Str2UniCoded(cIn[i]) // so auf den ersten Blick sollte GEORGs Funktion das machen was man hier braucht.
endif
next
return cOut
*----------------------------------------------------
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
um es deutlich zu sagen, C3 ist die HEX Form des Zeichens à !Jan hat geschrieben:So wird z. B. aus "ü" ein "ü". Aber um das ins Web zu senden brauche ich das nicht, sondern das muß "%C3%BC" heißen.
Welche Funktion schreibt mir das?
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Ich muss mich korrigieren was das %20 angeht, das kann man statt "+" auch verwenden.
Die normalen Ansi nach UTF8 Funktionen ersetzen eben die ZEICHEN und generieren keine HEX Form, aber die Funktion von GEORG mit seinem tollen Array oben tut das.
Die Frage ob man GET oder POST verwenden muss ist aber noch nicht sicher geklärt, hierbei spielt es auch eine Rolle wie man die Parameter füllt.
Nach meiner Erfahrung ist GET immer dann wenn man den kompletten String mit Parametern auch in eine Browserzeile eingeben kann.
Ansonsten gilt POST ... dabei wird die SERVER URL von den Parametern getrennt, dafür dürfen die aber auch sehr viel größer sein (also mehr Inhalt haben).
GET ist auf die Größe der Umgebungsvariablen begrenzt (wieviel das ist habe ich aber vergessen ...)
Die normalen Ansi nach UTF8 Funktionen ersetzen eben die ZEICHEN und generieren keine HEX Form, aber die Funktion von GEORG mit seinem tollen Array oben tut das.
Die Frage ob man GET oder POST verwenden muss ist aber noch nicht sicher geklärt, hierbei spielt es auch eine Rolle wie man die Parameter füllt.
Nach meiner Erfahrung ist GET immer dann wenn man den kompletten String mit Parametern auch in eine Browserzeile eingeben kann.
Ansonsten gilt POST ... dabei wird die SERVER URL von den Parametern getrennt, dafür dürfen die aber auch sehr viel größer sein (also mehr Inhalt haben).
GET ist auf die Größe der Umgebungsvariablen begrenzt (wieviel das ist habe ich aber vergessen ...)
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
ob es eine gibt kann ich nicht sagen, aber da die Stringlänge die man an den Server übergeben kann sehr begrenzt ist (wenn man es per GET an den Server übergibt) und die Übertragung selbst auch noch einiges dauert, spielen die paar Ersetzungen keine RolleJan hat geschrieben:Lieber wäre mir aber eine Funktion, die das automatisch umsetzt, denn so schnell ein StrTran() auch ist - mehrere Dutzend davon kosten sicher mehr Zeit als eine C-Funktion oder ein API-Aufruf (wenn es denn so einen gäbe)
eine Teiltabelle könnte ins Auge gehen, denn es gibt in der UTF8 Definition "verbotene" Zeichen und welche mit anderer Bedeutung, wenn nun ein solches zufällig im Text vorkommt und nicht übersetzt wird, dann könnte das für den Empfänger ein Problem darstellen (ich formuliere jetzt vorsichtiger )Jan hat geschrieben:Abgesehen davon: Danke für die Tabelle. Ich hab mir selber eine geschrieben, aber da hab ich nur die Umlaute, ß, und Leerzeichen drin, kostet halt Zeit sowas zusammen zu tippen.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Hallo Hubert,
Du legst da ja im Moment eine enorme Schlagzahl an den Tag ...
Ja, es ist richtig, das die Tabelle von Georg sehr weiter hilft. Ich hatte mir halt nur gewünscht, das es irgendeine Xbase++- oder Api-Funktion gibt, die sowas erledigt.
Und in Deinem letzten Posting sowie Deiner letzten PN an mich ist ein Fehler drin: %20 ist SPACE. Kein + (das ist %2B) oder " (das ist %22)
Jan
Du legst da ja im Moment eine enorme Schlagzahl an den Tag ...
Ja, es ist richtig, das die Tabelle von Georg sehr weiter hilft. Ich hatte mir halt nur gewünscht, das es irgendeine Xbase++- oder Api-Funktion gibt, die sowas erledigt.
Und in Deinem letzten Posting sowie Deiner letzten PN an mich ist ein Fehler drin: %20 ist SPACE. Kein + (das ist %2B) oder " (das ist %22)
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Da musst du besser lesen was ich schreibe, oder ich muss mich verständlicher ausdrücken ...Jan hat geschrieben:Und in Deinem letzten Posting sowie Deiner letzten PN an mich ist ein Fehler drin: %20 ist SPACE. Kein + (das ist %2B) oder " (das ist %22)
%20 entspricht der HEX Darstellung von chr(32) und das ist Space. Richtig.
Dass "+" das Gleiche wie ein " " ist, habe ich nicht behauptet, sondern dass ein Browser die EINGABE in ein Eingabefeld "Hans Meier" dann als Feldname=Hans+Meier übergibt !
Ebenso kann man das auch direkt in eine URL eingeben:
Code: Alles auswählen
xxx/cgi-bin/HBShowInfoPB.exe?name=Hans+Meier&vorname=Egon
Code: Alles auswählen
xxx/cgi-bin/HBShowInfoPB.exe?name=Hans Meier&vorname=Egon
Die %22 sind nur die Anführungszeichen die ich dem Text mit übergeben habe, weil dein Beispiel das auch so gemacht hat - und ich anfangs meinte der Browser macht die Großbuchstabenumwandlung, was aber mein Xbase Testprogramm war.
PS: xxx steht für meinen privaten Testserver, den ich hier nicht öffentlich zur Verfüng stelle. Wenn aber jemand bedarf hat zu sehen, was aus einer Web-Seite auf dem Server ankommt, kann er eine PN senden.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Ich habe hier nochmals nachgesehen:brandelh hat geschrieben:eine Teiltabelle könnte ins Auge gehen, denn es gibt in der UTF8 Definition "verbotene" Zeichen und welche mit anderer Bedeutung, wenn nun ein solches zufällig im Text vorkommt und nicht übersetzt wird, dann könnte das für den Empfänger ein Problem darstellen (ich formuliere jetzt vorsichtiger )
Code: Alles auswählen
http://de.wikipedia.org/wiki/UTF-8
Also chr(0) bis chr(127) darf man einfach 1:1 übergeben, ABER ALLES DARÜBER MUSS umgesetzt werden !00000000–01111111 00–7F 0–127 Ein-Byte lange Zeichen, deckungsgleich mit US-ASCII.
Hier könnte man auch die Standardfunktion nutzen, ein einzelnes Zeichen reingeben und die ASC() Werte des Ergebnisses nach %xx Verschlüsselung umsetzen.
Das wäre wohl am sichersten, es können auch 4 Byte aus einem werden !
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Web-UTF-8
Guter Hinweis!brandelh hat geschrieben:Also chr(0) bis chr(127) darf man einfach 1:1 übergeben, ABER ALLES DARÜBER MUSS umgesetzt werden !
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
wobei das natürlich nur für UTF-8 direkt gilt, die Ausnahmen für URL encoding hat Georg schon erwähnt:
für Xbase hat das eine besondere Bedeutung ...
und ob das € Zeichen so richtig ist weiß ich nicht, war das nicht abhängig von OEM / ANSI ?
Oder nur Ansi ...
bei UNICODE Übersetung wäre es laut WikiPedia:
Ich denke dass bei deinem Programm das € Zeichen keine Rolle spielt, aber viele der seltsamen Buchstaben sind bei nordischen oder französischen Namen gebräuchlich.
Code: Alles auswählen
aUniCode := {;
{Chr(037), "%25"},; // %
{Chr(036), "%24"},; // $
{Chr(038), "%26"},; // &
{Chr(064), "%40"},; // @
Code: Alles auswählen
{Chr(170), ""},; // bedingter Zeilenumbruch
Oder nur Ansi ...
Code: Alles auswählen
{Chr(213), "%E2%82%AC"},; // €
Code: Alles auswählen
Zeichen Unicode UTF-8
Buchstabe y U+0079 0x79 (%79)
Buchstabe ä U+00E4 0xC3 0xA4 (%C3 %A4)
Eurozeichen € U+20AC 0xE2 0x82 0xAC (%E2 %82 %AC)
- Dateianhänge
-
- UTF8-Ansi-Liste.txt
- (9.31 KiB) 161-mal heruntergeladen
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Web-UTF-8
Ich denke, dass wenn du die Variablen einzeln ganz normal nach UTF-8 übersetzt, dann diesen String byteweise (also mit der cStringVar Methode) von 128 bis 255 in %.. Schreibweise übersetzen läßt, zusätzlich noch die erwähnten Sonderzeichen, dann dürfte das sehr schnell sein, da der eigentliche String ja nicht neu kopiert werden muss wie bei += etc.
Gruß
Hubert
Hubert