Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Doppelte Hochkommata (https://www.delphipraxis.net/212932-doppelte-hochkommata.html)

tewes 26. Apr 2023 15:45

Delphi-Version: 10.2 Tokyo

Doppelte Hochkommata
 
Hallo,

ich bekomme per REST folgende URL:
dmsDocObj.URL :=
https://ffppas.XXX.de:8443/sap/opu/o...entsSet(Dokar=''TUP'',Doknr=''10043430922'',Doktl=''000'',Dokvr=''00'')/$value

Im Browser führen dann die doppelten Hochkommata zu einer Fehlermeldung: "Die Anforderungs-URI enthält ein ungültiges Schlüsselprädikat."

Folgendes habe ich versucht:
  • s := StringReplace(dmsDocObj.URL, #27#27, #27, [rfReplaceAll]);
  • s := StringReplace(dmsDocObj.URL, #27#27, '%27', [rfReplaceAll]);
  • s := AnsiDequotedStr(dmsDocObj.URL, #27);
  • s := StringReplace(dmsDocObj.URL, #27#27, '*', [rfReplaceAll]);
  • s := StringReplace(s, '*', #27, [rfReplaceAll]);


Wie bekomme ich die ersetzt durch einzelne?
'' --> '

IceBube 26. Apr 2023 16:10

AW: Doppelte Hochkommata
 
Bei mir funktionierts so

Delphi-Quellcode:
s = StringReplace(dmsDocObj.URL, '''''', '''', [rfReplaceALL]);
lg

milos 26. Apr 2023 16:13

AW: Doppelte Hochkommata
 
Es scheint als würdest du einfach Hexadezimale und Dezimale Were vertauschen. :)

#27 ist ASCII Dezimal 27 also ein ESCAPE. Um ' darzustellen, musst du 27 Hexadezimal nehmen, also #$27 (Mit dem Dollar Zeichen) oder 39 Dezimal, also #39.

Delphi-Quellcode:
s := StringReplace(dmsDocObj.URL, #$27#$27, #$27, [rfReplaceAll]);

himitsu 26. Apr 2023 16:19

AW: Doppelte Hochkommata
 
oder
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, #39#39, #39);

oder
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '''');

oder
Delphi-Quellcode:
s := AnsiDequotedStr(dmsDocObj.URL, '''');
(das Gegenteil vom Delphi-Referenz durchsuchenQuotedStr, bzw. eigentlich Delphi-Referenz durchsuchenAnsiQuotedStr)
oder

IceBube 26. Apr 2023 20:32

AW: Doppelte Hochkommata
 
Zitat:

Zitat von himitsu (Beitrag 1521579)
oder
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, #39#39, #39);

oder
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '''');

oder
Delphi-Quellcode:
s := AnsiDequotedStr(dmsDocObj.URL, '''');
(das Gegenteil vom Delphi-Referenz durchsuchenQuotedStr, bzw. eigentlich Delphi-Referenz durchsuchenAnsiQuotedStr)
oder

Diese Entscheidungen..furchtbar XD

himitsu 26. Apr 2023 21:43

AW: Doppelte Hochkommata
 
Wir hätten auch noch was mit RegEx
oder verschiedene FOR-Schleifen
oder ...





Delphi-Quellcode:
for var i := 1 to S.Length do if Copy(S, i, 2) = '''''' then Delete(S, i, 1);
:duck:
und nein, es werden nicht alle ' gelöscht, auch wenn es vielleicht so aussieht :stupid:

Uwe Raabe 26. Apr 2023 23:01

AW: Doppelte Hochkommata
 
Probier doch mal dieses (erfordert System.Sysutils):
Delphi-Quellcode:
S := dmsDocObj.URL.DeQuotedString;
// alternativ, wenn URL kein regulärer String ist
S := string(dmsDocObj.URL).DeQuotedString;

tewes 27. Apr 2023 09:10

AW: Doppelte Hochkommata
 
Vielen Dank für die Lösungsvorschläge!

Das habe ich versucht:
s := dmsDocObj.URL.DeQuotedString; // Vorschlag Uwe Raabe
s := StringReplace(dmsDocObj.URL, '''''', '''', [rfReplaceAll]); // Vorschlag IceBube
s := StringReplace(dmsDocObj.URL, #$27#$27, #$27, [rfReplaceAll]); // Vorschlag milos
s := ReplaceStr(dmsDocObj.URL, #39#39, #39); // Vorschlag himitsu
s := AnsiDequotedStr(dmsDocObj.URL, ''''); // Vorschlag himitsu

Leider keine Änderung.


Wenn ich im Debugger auf "Wert ändern" gehe und jeweils die beiden Hochkommata gegen einzelne austausche
'https://ffppas.XXX.de:8443/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar='LDP',Doknr='10043643970',Doktl ='000',Dokvr='00')/$value'

wird hinter "Dokar=" alles abgeschnitten
'https://ffppas.XXX.de:8443/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar='

tewes 27. Apr 2023 09:17

AW: Doppelte Hochkommata
 
Auch dies
Delphi-Quellcode:
for var i := 1 to S.Length do if Copy(S, i, 2) = '''''' then Delete(S, i, 1);
hilft leider nicht.

tewes 27. Apr 2023 09:52

AW: Doppelte Hochkommata
 
Delphi-Quellcode:
s := dmsDocObj.URL;
for p := 1 to s.length do
begin
  s2 := Copy(s, p, 2);
  if s2 = '''''' then
    Delete(s, p, 1); // Vorschlag himitsu
end;
s2 wird im interessanten Bereich (Dokar=''LDP'') nacheinander
'Do'
'ok'
'ka'
'ar'
'r='
'='''
'''L'
'LD'

Delphi-Quellcode:
if s2 = '''''' then
wird nie wahr

Delphi-Quellcode:
s := dmsDocObj.URL;
for p := 1 to s.length do
begin
  s2 := Copy(s, p, 2);
  if s2 = '=''' then
    Delete(s, p+1, 1);
end;
löscht die beiden führenden Hochkommata (gekürzt):
'Dokar=LDP''......

ConnorMcLeod 27. Apr 2023 09:54

AW: Doppelte Hochkommata
 
Was passiert, wenn man die doppelten einfachen Hochkommata auswechselt auf doppelte Hochkommata chr(34) ?

tewes 27. Apr 2023 10:33

AW: Doppelte Hochkommata
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1521633)
Was passiert, wenn man die doppelten einfachen Hochkommata auswechselt auf doppelte Hochkommata chr(34) ?

So
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '""');
bleiben die doppelten einfachen Hochkommata

Delphi.Narium 27. Apr 2023 10:54

AW: Doppelte Hochkommata
 
Zitat:

Zitat von tewes (Beitrag 1521640)
So
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '""');
bleiben die doppelten einfachen Hochkommata

Daraus schließe ich jetzt einfach mal: Die doppelten Hochkommata '' sehen aus wie '' sind in Wirklichkeit aber keine, sondern etwas bisher Unbekanntes.
Delphi-Quellcode:
s := dmsDocObj.URL;
s2 := '';
for p := 1 to s.length do
begin
  s2 := Format('%s#%.3d',[s2,Ord(Copy(s, p, 1))]);
end;
ShowMessage(s2);
Was kommt da raus?

Steht dadrinne irgendwo #061#039#039#076#068#080#039#039?
Wenn nein, was sind die zwei Zeichen vor #076#068#080 und was die zwei Zeichen dahinter?

Die Url im Eingangspost läßt sich im FireFox ohne besagte Fehlermeldung aufrufen.

Poste bitte mal die Originalurl aus dmsDocObj.URL (alles ab /sap/) zwischen [code]hier die Url einfügen[/code]-Tags.

ConnorMcLeod 27. Apr 2023 11:15

AW: Doppelte Hochkommata
 
Zitat:

Zitat von tewes (Beitrag 1521640)
Zitat:

Zitat von ConnorMcLeod (Beitrag 1521633)
Was passiert, wenn man die doppelten einfachen Hochkommata auswechselt auf doppelte Hochkommata chr(34) ?

So
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '""');
bleiben die doppelten einfachen Hochkommata

Sorry, habe zu kurz formuliert... ich meinte
Delphi-Quellcode:
StringReplace(dmsDocObj.URL, '''''', '"', [rfReplaceAll]);

... oder besser lesbar ...

StringReplace(dmsDocObj.URL, chr(39) + chr(39), chr(34), [rfReplaceAll]);
Also nur durch ein einziges doppeltes HK ersetzen.

himitsu 27. Apr 2023 11:58

AW: Doppelte Hochkommata
 
Wird im Debugger das doppelte '' angezeigt, oder ist es wirklich drin?

Im Debugger sieht ein ab'cd natürlich aus wie
Delphi-Quellcode:
'ab''cd'
, genauso wie im Quellcode, aber IM String ist natürlich nur ein '.

tewes 27. Apr 2023 12:00

AW: Doppelte Hochkommata
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1521656)
Zitat:

Zitat von tewes (Beitrag 1521640)
Zitat:

Zitat von ConnorMcLeod (Beitrag 1521633)
Was passiert, wenn man die doppelten einfachen Hochkommata auswechselt auf doppelte Hochkommata chr(34) ?

So
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '""');
bleiben die doppelten einfachen Hochkommata

Sorry, habe zu kurz formuliert... ich meinte
Delphi-Quellcode:
StringReplace(dmsDocObj.URL, '''''', '"', [rfReplaceAll]);

... oder besser lesbar ...

StringReplace(dmsDocObj.URL, chr(39) + chr(39), chr(34), [rfReplaceAll]);
Also nur durch ein einziges doppeltes HK ersetzen.

Code:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar=''LDP'',Doknr=''10043643970'',Doktl=''000'',Dokvr=''00'')/$value'
Delphi-Quellcode:
s := StringReplace(dmsDocObj.URL, chr(39) + chr(39), chr(34), [rfReplaceAll]);
ergibt
Code:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar=''LDP'',Doknr=''10043643970'',Doktl=''000'',Dokvr=''00'')/$value'

tewes 27. Apr 2023 12:01

AW: Doppelte Hochkommata
 
Zitat:

Zitat von himitsu (Beitrag 1521664)
Wird im Debugger das doppelte '' angezeigt, oder ist es wirklich drin?

Im Debugger sieht ein ab'cd natürlich aus wie
Delphi-Quellcode:
'ab''cd'
, genauso wie im Quellcode, aber IM String ist natürlich nur ein '.

Meine Beispiele sind mit "Wert kopieren" ausgelesen.

tewes 27. Apr 2023 12:17

AW: Doppelte Hochkommata
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1521649)
Zitat:

Zitat von tewes (Beitrag 1521640)
So
Delphi-Quellcode:
s := ReplaceStr(dmsDocObj.URL, '''''', '""');
bleiben die doppelten einfachen Hochkommata

Daraus schließe ich jetzt einfach mal: Die doppelten Hochkommata '' sehen aus wie '' sind in Wirklichkeit aber keine, sondern etwas bisher Unbekanntes.
Delphi-Quellcode:
s := dmsDocObj.URL;
s2 := '';
for p := 1 to s.length do
begin
  s2 := Format('%s#%.3d',[s2,Ord(Copy(s, p, 1))]);
end;
ShowMessage(s2);
Was kommt da raus?

Steht dadrinne irgendwo #061#039#039#076#068#080#039#039?
Wenn nein, was sind die zwei Zeichen vor #076#068#080 und was die zwei Zeichen dahinter?

Die Url im Eingangspost läßt sich im FireFox ohne besagte Fehlermeldung aufrufen.

Poste bitte mal die Originalurl aus dmsDocObj.URL (alles ab /sap/) zwischen [code]hier die Url einfügen[/code]-Tags.

Copy() ergänzt um Copy()[1]
Delphi-Quellcode:
s := dmsDocObj.URL;
s2 := '';
for p := 1 to s.length do
begin
  s2 := Format('%s#%.3d',[s2, Ord(Copy(s, p, 1)[1] )]);
end;
Code:
'#104#116#116#112#115#058#047#047#102#102#112#112#097#115#046#097#100#046#107#108#105#110#105#107#046#117#110#105#045#117#108#109#046#100#101#058#056#052#052#051#047#115#097#112#047#111#112#117#047#111#100#097#116#097#047#115#097#112#047#090#095#073#083#072#077#069#068#095#066#065#083#073#067#095#065#080#073#095#083#082#086#047#100#111#099#117#109#101#110#116#115#083#101#116#040#068#111#107#097#114#061#039#076#068#080#039#044#068#111#107#110#114#061#039#049#048#048#052#051#054#052#051#057#055#048#039#044#068#111#107#116#108#061#039#048#048#048#039#044#068#111#107#118#114#061#039#048#048#039#041#047#036#118#097#108#117#101'
Es steht nur jeweils ein #039 davor und danach. Damit wäre der String korrekt und ich muss den Fehler an anderer Stelle suchen...:oops:

himitsu 27. Apr 2023 12:25

AW: Doppelte Hochkommata
 
Zitat:

Zitat von tewes (Beitrag 1521667)
Zitat:

Zitat von himitsu (Beitrag 1521664)
Wird im Debugger das doppelte '' angezeigt, oder ist es wirklich drin?

Im Debugger sieht ein ab'cd natürlich aus wie
Delphi-Quellcode:
'ab''cd'
, genauso wie im Quellcode, aber IM String ist natürlich nur ein '.

Meine Beispiele sind mit "Wert kopieren" ausgelesen.

Wie gesagt, dann ist nur 1 Apostroph im String.
Angezeigt/kopiert wird die Schreibweise der String-Konstante.
Darum auch vorne und hinten noch je ein '


Wären es wirklich Doppelte, dann sähe es so aus
Delphi-Quellcode:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar=''''LDP'''',Doknr=''''10043643970'''',Doktl=''''000'''',Dokvr=''''00'''')/$value'


Delphi-Quellcode:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar=''LDP'',Doknr=''10043643970'',Doktl=''000'',Dokvr=''00'')/$value'

entspricht
/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar='LDP',Doknr='10043643970',Doktl ='000',Dokvr='00')/$value

die Konstante hätte aber auch z.B. so aussehen können
Delphi-Quellcode:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar='#39'LDP'#39',Doknr='#39'10043643970'#39',Doktl='#39'000'#39',Dokvr='#39'00'#39')/$value'

oder in der ausführlichen Schreibweise
Delphi-Quellcode:
'/sap/opu/odata/sap/Z_ISHMED_BASIC_API_SRV/documentsSet(Dokar=' + #39 + 'LDP' + #39 + ',Doknr=' + #39 + '10043643970' + #39 + ',Doktl=' + #39 + '000' + #39 + ',Dokvr=' + #39 + '00' + #39 + ')/$value'

oder oder oder ...

Ein doppeltes '' in der String-Konstante ist ein '-Zeichen.
Ein einfaches ' am Anfang/Ende/Dazwischen ist der Anfange oder das Ende der Konstante.
Und ''' am Anfang oder Ende sind der Anfang/Ende plus ein '-Zeichen.


Ähnlich wie in C-Sprachen ein \-Zeichen als \\ in String-Konstanten steht.

Rolf Frei 27. Apr 2023 12:40

AW: Doppelte Hochkommata
 
Zitat:

Zitat von tewes (Beitrag 1521574)
Hallo,

ich bekomme per REST folgende URL:
dmsDocObj.URL :=
https://ffppas.XXX.de:8443/sap/opu/o...entsSet(Dokar=''TUP'',Doknr=''10043430922'',Doktl=''000'',Dokvr=''00'')/$value

Das Problem ist einfach nur, dass weder ' noch " in einer URL zugelassen sind und diese URL-codiert werden müssen. Deine fertige URL müsste wie folgt sein: .../documentsSet(Dokar=%39LDP%39,Doknr=%3910043643970% 39 ... usw.

" entspricht %39 als urlcodierter Wert.

Alle hier erwähnten Lösungen konvertieren den Text in Delphi Syntax, aber lösen nicht den Grundfehler, dass die URL nicht korrekt codiert ist.

EDIT: Das letzte %39 in meienem obigen Beispiel darf kein Leerschlag enthalten! Also immer %39, da macht die Forumsoftware irgend was damit falsch.

tewes 27. Apr 2023 12:50

AW: Doppelte Hochkommata
 
Danke an alle für die Hilfe

himitsu 27. Apr 2023 12:58

AW: Doppelte Hochkommata
 
War das % nicht Hexadezimal?

also %27 nicht 39 (aka #39 vs. #$27 )


PS: Irgendwo wird es bestimmt ein UrlEncode (oder sowas) dafür geben.

Uwe Raabe 27. Apr 2023 21:11

AW: Doppelte Hochkommata
 
Zitat:

Zitat von himitsu (Beitrag 1521682)
PS: Irgendwo wird es bestimmt ein UrlEncode (oder sowas) dafür geben.

Na sicher:
Delphi-Quellcode:
TURLEncoding
in System.NetEncoding. Naheliegend, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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