shell-skript zum umwandeln des query_strings
Manfred Schied
- cgi
0 Cheatah
hallo!
kann mir jemand ein unix-shell-skript zur umwandlung der sonderzeichen im query_string geben? ich hoffe, daß ein solches schon irgendwo existiert. das skript sollte den query_string nicht zerlegen, sondern einfach nur die sonderzeichen wieder herstellen.
danke schon mal.
mfg
Manfred
Hi,
kann mir jemand ein unix-shell-skript zur umwandlung der sonderzeichen im query_string geben? ich hoffe, daß ein solches schon irgendwo existiert.
hierbei kann ich Dir leider nicht helfen, aber...
das skript sollte den query_string nicht zerlegen, sondern einfach nur die sonderzeichen wieder herstellen.
...dies dürfte spätestens bei "script.cgi?name=zwei%26wert%3Dhier" Probleme ergeben. Deswegen fürchte ich, daß Du mit diesem Ansatz nur schwerlich fündig wirst :-)
Cheatah
Hallo
...dies dürfte spätestens bei "script.cgi?name=zwei%26wert%3Dhier" Probleme ergeben. Deswegen fürchte ich, daß Du mit diesem Ansatz nur schwerlich fündig wirst :-)
ok, muß ich dir recht geben. wenn der gesamte query_string umgewandelt wird und dann '&' oder '=' enthalten ist, kann das durchaus ein problem beim zerlegen geben.
aber wenn ich es mir genau überlege, muß eigentlich nur ein teil des gesamten query_strings umgewandelt werden. diesen teil habe ich bereits herausgeschnitten. wenn es also schon irgendwo ein skript gibt, dann kann ich es noch immer brauchen!
falls es eine andere möglichkeit gibt, z.b. perl-skript in kombination mit meinem bisherigen shell-skript, bin ich dafür natürlich auch dankbar.
mit welchen unix-befehlen könnte man die umwandlung der hex-werte in die richtigen zeichen lösen?
wie bekomme ich statt den '+'-zeichen die leerzeichen rein?
grüße
Manfred
Hi!
Mit Perlscript kann ich schon dienen.
sub uri_unescape
{
# Note from RFC1630: "Sequences which start with a percent sign
# but are not followed by two hexadecimal characters are reserved
# for future extension"
my @copy = @_;
for (@copy) { s/%([\dA-Fa-f]{2})/chr(hex($1))/eg; }
wantarray ? @copy : $copy[0];
}
Stolen from URI::Escape. :)
Dann ist $entcodiert = uri_unescape($codiert); das was du suchst.
Zumindest sollte es funktionieren. Sonst mußte dich eben per
use URI::Escape;
bedienen.
CU
ArneB
hallo
Mit Perlscript kann ich schon dienen.
danke dafür. leider hab ich mit perl nicht so viel am hut bzw. weiß ich nicht so recht, wie ich es in mein bestehendes shell-skript einbinden soll.
ich hab jetzt eine andere lösung:
ich kramte meine zugegeben schon etwas verstaubten c-kenntnisse hervor und schrieb ein programm, das mir von der kommandozeile den codierten string einliest, ihn decodiert und schließlich einfach am bildschirm ausgibt.
der aufruf im shell-skript sieht dann folgendermaßen aus:
DECODIERT=./unescape $CODIERT
echo $DECODIERT
wobei "unescape" der name des kompilierten c-programms ist.
da ich meine erkenntnisse nicht nur für mich behalten will, ist hier der source!
//////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int sonderzeichen(char *kom);
int main(int argc, char *argv[])
{
sonderzeichen(argv[1]);
return 1;
}
int sonderzeichen(char *kom)
{
int i, m = 0;
int leng;
int z, tag = 0;
char zh;
char a[2];
leng = strlen(kom);
for(i = 0; i < leng; i++)
{
if(kom[i] == '+')
kom[i] = ' ';
if(kom[i] == '%')
{
a[0] = *(kom + i + 1);
a[1] = *(kom + i + 2);
sscanf(a, "%02X", &z);
*(kom + i - m) = z;
i = i + 2;
m = m + 2;
}
else
*(kom + i - m) = *(kom + i);
}
*(kom + i - m) = '\0';
printf("%s", kom);
return tag;
}
////////////////////////////////////////////
kompilierung (unter unix): cc -o unescape unescape.c
vielleicht kann's ja noch jemand gebrauchen ...
grüße
Manfred
PS helft euch selbst, sonst hilft euch keiner! ;-)