Web-UTF-8

Vom Front-End bis SOAP.

Moderator: Moderatoren

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Web-UTF-8

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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 ...

Code: Alles auswählen

GetCgiString( <oHtmlFormElement> ) --> cCgiString 
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.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

Hallo Hubert,

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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

ich zeige mal ein Beispiel, welches aus einer HTML FORM erzeugt und übergeben wurde.

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 
ist das so ein ANSI String ?

Code: Alles auswählen

vorname=test&name=xyz&strasse=%E4%F6%FC+%DF&plz=&ort=&anmerkung=&Extra=JAHR&SendData=Senden 
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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.

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,"ä","&auml;")
   cTxt := strTran(cTxt,"ö","&ouml;")
   cTxt := strTran(cTxt,"ü","&uuml;")
   cTxt := strTran(cTxt,"Ä","&Auml;")
   cTxt := strTran(cTxt,"Ö","&Ouml;")
   cTxt := strTran(cTxt,"Ü","&Uuml;")
   cTxt := strTran(cTxt,"ß","&szlig;")
   cTxt := strTran(cTxt,"²","&sup2;")
   cTxt := strTran(cTxt,"³","&sup3;")
   cTxt := strTran(cTxt,"°","&deg;")
*   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,"|","&brvbar;")
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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

hier ist das gleiche Problem angesprochen und dort steht auch der Name "URL-ENCODE" ... ;-)

http://www.xbaseforum.de/viewtopic.php? ... 848#p39613
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

Schick mir doch mal so einen String per PN und ich sehe welche Funktion du brauchst ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

Hallo Hubert,

ist raus.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Web-UTF-8

Beitrag von georg »

Hallo, Jan -


OT4XB, und die Funktion heisst cAnsiToUtf8().
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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 ;-)

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)
Hier die Testergebnisse, wobei die Anzeige im CRT Fenster natürlich die Umlaute falsch anzeigt.
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...
Falls du UTF-8 liefern musst, musst du halt die Feldinhalte etwas anders umsetzen.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Web-UTF-8

Beitrag von georg »

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:

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)
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:

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"};          // ­
      }
Vielleicht hilft Dir das ja weiter?

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.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

Hallo Georg,
Georg 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?
Was mehr soll ich schreiben als in meinem Eingangsposting
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.
Das deckt sich mit Deiner Übersetzungstabelle, und damit ist die Antwort ja eigentlich klar.

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.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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:

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
*----------------------------------------------------
... wie geschrieben, Georgs Array passt da bestens ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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?
um es deutlich zu sagen, C3 ist die HEX Form des Zeichens à !
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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 ...)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

Jan 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)
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 Rolle ;-)
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.
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 ;-) )
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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)
Da musst du besser lesen was ich schreibe, oder ich muss mich verständlicher ausdrücken ... :?

%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
wird zu "Hans Meier" übersetzt. Ich hatte dir zugestimmt, dass ich mich hier geirrt hatte (dort meinte ich auch dass es durch ein + ersetzt wird):

Code: Alles auswählen

xxx/cgi-bin/HBShowInfoPB.exe?name=Hans Meier&vorname=Egon
dieses Space wird zu %20 wie du es gesagt hast.

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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 ;-) )
Ich habe hier nochmals nachgesehen:

Code: Alles auswählen

http://de.wikipedia.org/wiki/UTF-8
00000000–01111111 00–7F 0–127 Ein-Byte lange Zeichen, deckungsgleich mit US-ASCII.
Also chr(0) bis chr(127) darf man einfach 1:1 übergeben, ABER ALLES DARÜBER MUSS umgesetzt werden !

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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von Jan »

brandelh hat geschrieben:Also chr(0) bis chr(127) darf man einfach 1:1 übergeben, ABER ALLES DARÜBER MUSS umgesetzt werden !
Guter Hinweis!

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

wobei das natürlich nur für UTF-8 direkt gilt, die Ausnahmen für URL encoding hat Georg schon erwähnt:

Code: Alles auswählen

 aUniCode := {;
      {Chr(037), "%25"},;            // %
      {Chr(036), "%24"},;            // $
      {Chr(038), "%26"},;            // &
      {Chr(064), "%40"},;            // @
für Xbase hat das eine besondere Bedeutung ...

Code: Alles auswählen

      {Chr(170), ""},;               // bedingter Zeilenumbruch
und ob das € Zeichen so richtig ist weiß ich nicht, war das nicht abhängig von OEM / ANSI ?
Oder nur Ansi ...

Code: Alles auswählen

      {Chr(213), "%E2%82%AC"},;      // €
bei UNICODE Übersetung wäre es laut WikiPedia:

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)
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.
Dateianhänge
UTF8-Ansi-Liste.txt
(9.31 KiB) 155-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Web-UTF-8

Beitrag von brandelh »

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
Antworten