Seite 1 von 2
Web-UTF-8
Verfasst: Sa, 11. Apr 2015 14:50
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 14:58
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 ...
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.
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 15:12
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 16:12
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 16:16
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,"ä","ä")
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 16:24
von brandelh
hier ist das gleiche Problem angesprochen und dort steht auch der Name "URL-ENCODE" ...
http://www.xbaseforum.de/viewtopic.php? ... 848#p39613
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 17:23
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 19:04
von brandelh
Schick mir doch mal so einen String per PN und ich sehe welche Funktion du brauchst
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 19:15
von Jan
Hallo Hubert,
ist raus.
Jan
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 19:17
von georg
Hallo, Jan -
OT4XB, und die Funktion heisst cAnsiToUtf8().
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 19:19
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 21:31
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.
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 21:44
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 ...
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 21:52
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 21:57
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 22:15
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
Re: Web-UTF-8
Verfasst: Sa, 11. Apr 2015 22:49
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 à !
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 9:51
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 ...)
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 10:10
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
)
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 10:14
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
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 10:24
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.
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 10:30
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:
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 !
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 11:50
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
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 12:39
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 ...
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:
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.
Re: Web-UTF-8
Verfasst: Mo, 13. Apr 2015 12:45
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.