Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   %20 in Leerzeichen Umwandeln (https://www.delphipraxis.net/72095-20-leerzeichen-umwandeln.html)

la.reunion 25. Jun 2006 15:54


%20 in Leerzeichen Umwandeln
 
Hallo, ich möchte in kelines prog schriben mit dem ich Leerzeichen %20 umwandeln kann und anders rum wie amche cih das?
(Einen Lik umwandeln!!!)#

Lg La.Reunion

arbu man 25. Jun 2006 15:56

Re: %20 in Leerzeichen Umwandeln
 
Delphi-Referenz durchsuchenStringReplace

la.reunion 25. Jun 2006 15:58

Re: %20 in Leerzeichen Umwandeln
 
danke!

Mhh das verstehe ich nciht ganz kannst du mir ein beispiel dazu posten?

vlees91 25. Jun 2006 16:01

Re: %20 in Leerzeichen Umwandeln
 
vll so (nicht probiert)

Delphi-Quellcode:
function URLEncode(URL: string): string;
var
  i:integer;
  URL2: string;
begin
  URL2 := '';
  for i := 0 to length(URL) - 1 do
  begin
    if URL[i] in ['a'..'z', 'A'..'Z', '.', '-', '_', '0'..'9'] {kontrolle erweitert...} then URL2 := URL2 + '%' + IntToHex(ord(URL[i]), 2) //in der Eile die umwandlung vergessen
    else URL2 := URL2 + URL[i];
  end;
  //result vergessen
  result := URL2;
end;

Muetze1 25. Jun 2006 16:03

Re: %20 in Leerzeichen Umwandeln
 
Naja, ich würde das nicht so einfach machen, weil das % Zeichen selber auch escape't werden kann. Wenn man ein % in der URL haben möchte, dann schreibt man %%, somit sollte eine URL von "%%20" falsch von dir verarbeitet werden. Auch fehlen dir dann z.B. die Punkte (%2F) etc. Geh lieber die Zeichenkette durch und bau alle Elemente mit % und einem 2-stelligem Hexadezimalwert um (es ist der ANSI Code des Zeichens angegeben) und ignorieren %% Zeichen. Dann biste auf der sicheren Seite.

la.reunion 25. Jun 2006 16:05

Re: %20 in Leerzeichen Umwandeln
 
??! Mhhh ich hatte mir das irgendwie unkomplizierter vorgestellt :-)

vlees91 25. Jun 2006 16:07

Re: %20 in Leerzeichen Umwandeln
 
@muetze1:ist das auf meinen oder auf arbu mans bezogen?
meine funktioniert imho so wie bei php urlencode bzw rawurlencode

marabu 25. Jun 2006 16:16

Re: %20 in Leerzeichen Umwandeln
 
Hallo,

wer die Indy-Komponenten verwendet, der kann die Methoden UrlEncode() und UrlDecode() von TIdURI (V9) benutzen um die percent escapes zu erstellen oder aufzulösen.

Grüße vom marabu

Edit: ich hänge mal die eine Zeile Code unauffällig hier rein, damit der schwungvolle thread nicht abrupt zum Halten kommt:

Delphi-Quellcode:
uses
  IdURI;

function URLDecode(uri: String): String;
begin
  Result := TIdURI.URLDecode(uri);
end;
Das Prozentzeichen muss übrigens %25 codiert sein - %% habe ich im Standard nicht entdecken können.

Brainstalker 25. Jun 2006 16:21

Re: %20 in Leerzeichen Umwandeln
 
Ich hatte da mal eine Funktion geschrieben. Allerdings war das ne Arbeit von 5 Minuten oder so, weil ich mal schnell eben eine brauchte. Es sind deshalb auch keine Kommentare vorhanden.
Delphi-Quellcode:
function TranslateURL(URL: string; Encode: bool): string;
var
  i: integer;
  tmp: string;
begin
  result := 'ERROR';
  i := 1;
  tmp := '';
  URL := LowerCase(URL);

  if not Encode then
    while i <= Length(URL) do begin
      if (URL[i] = '%') and (URL[i+1] in ['0'..'9', 'a'..'f'])
      and (URL[i+2] in ['0'..'9', 'a'..'f']) then begin
        tmp := tmp + chr(StrToInt('$' + Copy(URL, i+1, 2)));
        inc(i, 2);
      end else
        tmp := tmp + URL[i];
      inc(i);
    end;

  if Encode then
    while i <= Length(URL) do begin
      if URL[i] in ['0'..'9', 'a'..'z', '.', '-', '_'] then
        tmp := tmp + URL[i]
      else
        tmp := tmp + '%' + IntToHex(ord(URL[i]), 2);
      inc(i);
    end;

  result := tmp;
end;
Falls irgendwas näher erklärt werden soll, einfach nachfragen. Aufgerufen wird das Ganze so:
Delphi-Quellcode:
Encode:
URL := TranslateURL(URL, true);

Decode:
URL := TranslateURL(URL, false);
MfG Brainstalker

[Edit] , hinzugefügt :oops:
[Edit2] jetzt sollte das mit Encode stimmen.

vlees91 25. Jun 2006 16:23

Re: %20 in Leerzeichen Umwandeln
 
Zitat:

Zitat von Brainstalker
Delphi-Quellcode:
Encode:
URL := TranslateURL(URL, true);

Decode:
URL := TranslateURL(URL[b],[/b] false);

und Encode ist das kodieren und bei dir wird bei Encode := false kodiert

bei der kodierung nicht die großbuchstaben vergessen... (sry hab das lowercase übersehen)

Brainstalker 25. Jun 2006 16:35

Re: %20 in Leerzeichen Umwandeln
 
Nö das mit "verschlüsseln" und entschlüsseln ist schon richtig. Denn für mich ist ne Adresse die so aussieht "verschlüsselt": http://www.goo%20gle.de und diese "entschlüsselt": http://www.goo gle.de.

Auf Großbuchstaben muss auch nicht geachtet werden, da der String vorher mit LowerCase bearbeitet wird. Das einzige was dann eben noch nicht richtig unterstützt wird sind äöü.

vlees91 25. Jun 2006 16:40

Re: %20 in Leerzeichen Umwandeln
 
für mich auch

aber um goo%20gle zu bekommen, muss encode auf false stehen

Brainstalker 25. Jun 2006 16:43

Re: %20 in Leerzeichen Umwandeln
 
Ja stimmt das seh ich auch gerade. :wall:
Egal aber die Funktion funktioniert ja trotzdem, ich änder das mal schnell. :oops:

vlees91 25. Jun 2006 16:48

Re: %20 in Leerzeichen Umwandeln
 
meine auch ;) (aber nur in eine richtung ;))

stoxx 25. Jun 2006 16:50

Re: %20 in Leerzeichen Umwandeln
 
StringReplace gefällt Euch wohl nicht ?

übrigens Brainstalker, Deine Funktion ist nicht save, Du greifst auf i+1 zu und prüfst nicht, ob i+1 kleiner oder gleich der Länge vom String ist.

Brainstalker 25. Jun 2006 17:29

Re: %20 in Leerzeichen Umwandeln
 
Wie gesagt ich hab das mal in 5 Minuten gebastelt weil ich ein paar URLs hatte und keine Lust die selbst zu übersetzen. Außerdem kann der Threadersteller ja auch noch bisl Hand anlegen und die Save machen, ist ja nicht viel Arbeit. Mal sehen vielleicht änder ich die ja nochmal ab.
Naja String Replace kann man natürlich anwenden wenn man nur Leerzeichen oder so ersetzen will, aber die Funktion ist eben dafür gedacht (fast) alle Zeichen zu ersetzen. Sonderzeichen könnten noch ein Problem darstellen, aber man kanns ja noch erweitern.
Ich setz mich nachher nochmal kurz hin und werde sie vielleicht ein bisschen abändern.

Muetze1 25. Jun 2006 18:39

Re: %20 in Leerzeichen Umwandeln
 
und wenn man ein % Zeichen in der URL hat, wird dieses auch wiederrum von keiner Lösung ordentlich gehandhabt.

new32 2. Jul 2006 20:44

Re: %20 in Leerzeichen Umwandeln
 
Hi!
Ich hab auch mal ne Lösung für das Problem in 6 Minuten geschrieben(leider C)
kann aber nach veränderungen als dll kompiliert werden und auch in delphi-programmen genutzt werden.

Code:
#include<stdio.h>
#include<string.h>

int itoaY(int i, char *a, int z){
  int v=1,w=0;
  while(i/v>=1) v*=z;v/=z;
  while(v>=1) a[w]=i/v,i-=a[w]*v,a[w]+=(a[w]<=9)?'0':'A'-10,w++,v/=z;
  a[w++]='\0';
  return w;
}

int copy(char *x, char *y){
int i=0;
while(y[i]!='\0') x[i]=y[i++];
x[i+1]='\0';
return i;
}

int cmp(char *a1, char *a2, int n){
  int i;
  i=0;
  while(i<=n-1){
    if(a1[i]!=a2[i]) return i+1;
    i++;
  }
  return 0;
}

int cpy(char *a1, char *a2, int n){
  int i;
  i=0;
  while(i<=n){
    a1[i]=a2[i];
    i++;
  }
  return i;
}

int setlen(char *s, char *dest, int olen, int nlen, char null){
  olen-=nlen;
  while(nlen>=0) (dest[nlen]=(nlen+olen>=0)?s[nlen+olen]:null),nlen--;
  return 0;
}

void C(char c[192][8]){
  int i,j;
  for(i=j=0;i<256;i++,j++){
    i=(i<1)?1:(i==32)?33:(i==47)?58:(i==65)?91:(i==97)?123:i;
    c[j][0]=i;
    c[j][7]=1;
  }
  c[j][0]=' ';
  c[j][7]=1;
}

void URL(char url[192][8]){
  int i,j;
  char t[4];
  for(i=j=0;i<256;i++,j++){
    i=(i<1)?1:(i==32)?33:(i==47)?58:(i==65)?91:(i==97)?123:i;
    url[j][0]='%';
    setlen(t,&(url[j][1]),itoaY(i,t,16),3,'0');
    url[j][7]=3;
  }
  url[127][1]='C';
  url[j][0]='+';
  url[j][7]=1;
}


void HTML(char html[192][8]){
  int i,j;
  for(i=j=0;i<256;i++,j++){
    i=(i<1)?1:(i==32)?33:(i==47)?58:(i==65)?91:(i==97)?123:i;
    html[j][0]='&';
    html[j][1]='#';
    html[j][7]=itoaY(i,&(html[j][2]),10)+2;
    html[j][html[j][7]-1]=';';
  }
  copy(html[9],"
"); html[9][7]=4;
  html[12][7]=0;

  copy(html[63],"&#8364;"); html[63][7]=7;

  copy(html[65],"&#8218;"); html[65][7]=7;
  copy(html[66],"&#402;"); html[66][7]=7;
  copy(html[67],"&#8222;"); html[67][7]=7;
  copy(html[68],"&#8230;"); html[68][7]=7;
  copy(html[69],"&#8224;"); html[69][7]=7;
  copy(html[70],"&#8225;"); html[70][7]=7;
  copy(html[71],"&#710;"); html[71][7]=7;
  copy(html[72],"&#8240;"); html[72][7]=7;
  copy(html[73],"&#352;"); html[73][7]=7;
  copy(html[74],"&#8249;"); html[74][7]=7;
  copy(html[75],"&#338;"); html[75][7]=7;

  copy(html[77],"&#381;"); html[77][7]=7;

  copy(html[80],"&#8216;"); html[80][7]=7;
  copy(html[81],"&#8217;"); html[81][7]=7;
  copy(html[82],"&#8220;"); html[82][7]=7;
  copy(html[83],"&#8221;"); html[83][7]=7;
  copy(html[84],"&#8226;"); html[84][7]=7;
  copy(html[85],"&#8211;"); html[85][7]=7;
  copy(html[86],"&#8212;"); html[86][7]=7;
  copy(html[87],"&#732;"); html[87][7]=7;
  copy(html[88],"&#8482;"); html[88][7]=7;
  copy(html[89],"&#353;"); html[89][7]=7;
  copy(html[90],"&#8250;"); html[90][7]=7;
  copy(html[91],"&#339;"); html[91][7]=7;

  copy(html[93],"&#382;"); html[93][7]=7;
  copy(html[94],"&#376;"); html[94][7]=7;

  html[j][0]=' ';
  html[j][7]=1;
}

int convert(char *in, char *out, void (*fin)(char [192][8]), void (*fout)(char [192][8])){
  int i,j,k=0;
  char io[2][192][8];

  fout(io[0]);
  fin(io[1]);
  for(i=0;in[i]!='\0';i++,k++){
    for(j=0;j<=191 && j!=-1;j++) if(!cmp(&(in[i]),io[1][j],io[1][j][7])) cpy(&(out[k]),io[0][j],io[0][j][7]),i+=io[1][j][7],k+=io[0][j][7],j=-1;
    if(j!=-1) out[k]=in[i];
  }
  out[k++]='\0';
  return k;
}

int GetParamElement(char *s, char *en, char *element){
  int i=0,lp,j=0;
  lp=strlen(en);
  while(cmp(&(s[i]),en,lp) && s[i]!='\0') i++; i+=lp;
  while(s[i]!='&' && s[i]!='\0') element[j++]=s[i++];
  element[j++]='\0';
  return j;
}

int GetParamElementC(char *s, char *en, char *element){
  int i=0,lp,j=0;
  lp=strlen(en);
  while(cmp(&(s[i]),en,lp) && s[i]!='\0') i++; i+=lp;
  while(s[j+i]!='&' && s[j+i]!='\0') j++;
  s[i+j]='\0';
  lp=convert(&(s[i]),element,URL,C);
  s[i+j]='&';
  return lp;
}

int GetParamElementHTML(char *s, char *en, char *element){
  int i=0,lp,j=0;
  lp=strlen(en);
  while(cmp(&(s[i]),en,lp) && s[i]!='\0') i++; i+=lp;
  while(s[j+i]!='&' && s[j+i]!='\0') j++;
  s[i+j]='\0';
  lp=convert(&(s[i]),element,URL,HTML);
  s[i+j]='&';
  return lp;
}

void incHTML(char *x) {
  char c[256];
  FILE *f;
  long l=0;
  if(f=fopen(x,"rb")){   
    while(!feof(f)){   
      fread(c,256,1,f);
      fwrite(c,ftell(f)-l,1,stdout);
      l+=256;
    }
  }
}

int main(void){                                  //Beispiel
  char d[256]="index.exe?pp=Hello+World%21%0A123&ff=11",v[256];

  GetParamElementHTML(d,"pp=",v);
  printf("%s",v);


  return 0;
}
sind noch nen paar Extras :thumb: dabei(hab die ganze C-Datei kopiert!)

MfG NEW32!

la.reunion 20. Jul 2006 20:31

Re: %20 in Leerzeichen Umwandeln
 
ICh lass auhc mal wieder was von mir hören.

Delphi-Quellcode:
function wandlelinkum(link : string) : string;
 var
   position,zahl : integer;
   zeichen : char;
 begin
   result := link;
   while pos('%',result) <> 0 do
   begin
     position := pos('%',result) + 1;
     zahl := strtoint('$'+copy(result,position,2));
     zeichen := char(zahl);
     delete(result,position - 1,3);
     insert(zeichen,result,position - 1);
   end;
 end;

Muetze1 20. Jul 2006 20:35

Re: %20 in Leerzeichen Umwandeln
 
Grundlegend: Der Code ist gut, da er dadurch alle Codes beachtet. So meinte ich das auch. Aber eine Anmerkung dazu: Du löscht fest 2 Zeichen - aber es kann theoretisch auch nur eine Zahl nach dem % kommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz