AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Escape sequenzen ersetzen

Ein Thema von manuel.taber · begonnen am 25. Aug 2011 · letzter Beitrag vom 11. Apr 2016
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.660 Beiträge
 
Delphi 12 Athens
 
#1

AW: Escape sequenzen ersetzen

  Alt 25. Aug 2011, 13:34
Vielleicht denke ich zu simpel, aber wieso nicht StringReplace? Das ist vielleicht nicht die schnellste Möglichkeit, aber wenn der Ausgangsstring nicht allzu lang ist, sollte das doch kein Problem sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Escape sequenzen ersetzen

  Alt 25. Aug 2011, 13:57
Zuerst müssen doch einmal die genauen Kodierungsregeln bekannt sein. Wie wird denn z.B.diese Original-Zeichenkette kodiert?
Code:
'äöü' wird als '\xe4\xf6\xfc' codiert!
Bei der Rückgewinnung sollte dann doch nicht herauskommen:
Code:
'äöü' wird als 'äöü' codiert!
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Escape sequenzen ersetzen

  Alt 25. Aug 2011, 14:09
Zuerst müssen doch einmal die genauen Kodierungsregeln bekannt sein.
Deswegen habe ich ja gefragt, wie '\' codiert wird.
Wenn das Prinzip klar ist, kann man aus stExpectX ein stExcpectModifier (oder so) machen und '\n', '\0' und andere ähnlich behandeln.

EDIT:
Ich habe den Code mal getestet und verbessert.
Wer mit Lazarus testet, sollte die Ausgabe besser mit AnsiToUtf8 behandeln.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (25. Aug 2011 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.813 Beiträge
 
Delphi 12 Athens
 
#4

AW: Escape sequenzen ersetzen

  Alt 8. Apr 2016, 12:12
Ich kram das hier mal aus der Versenkung, weil das fast auf mein Gegenwärtiges Problem zutrifft: Datenquelle ist ein Python YAML. Ich erhalte escapete Unicodestrings wie zum Beispiel 'Gl\xF6ckner' an Stelle von 'Glöckner'. YAML ist nix anderes als hübscheres JSON (überspitzt gesagt, ich nutze YAML eigentlich nur, weil es einen Datumstypen kennt, was unter Python ein Segen ist, da kennt JSON nämlich [Standardkonform] keinen). Zurück zu meinem Problem: Was hier geschildert wurde ist ein Eigenbau, den ich von einem "Web" und "IoT" affinen Konstrukt wie Delphi in der Reinkarnation Seattle als eingebaut angesehen hätte. Ich finde aber nicht wirklich etwas hilfreiches. Es gibt Vorschläge TJSONObject.ParseJSONValue zu verwenden. Das scheitert daran, daß mein YAML eben kein JSON ist, denke ich. Zumindest bleibt das JSON Objekt leer, nach dem Parsen des Strings.

Edith fand heraus, daß ParseJSONValue daran scheitert, daß \x nicht vorgesehen ist sondern nur \u...

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann

Geändert von Sherlock ( 8. Apr 2016 um 12:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.813 Beiträge
 
Delphi 12 Athens
 
#5

AW: Escape sequenzen ersetzen

  Alt 8. Apr 2016, 13:30
OK, es hat jetzt doch ein versöhnliches Ende genommen. Ich mache folgendes bei der Auswertung der empfangenen Strings:
myJSONValue := TJSONObject.ParseJSONValue(StringReplace(temp, '\x', '\u00', [])); Das klappt brauchbar.

Sherlock
- der schon mal den Bagger bestellt, damit dieser Thread wieder eingegraben werden kann.
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: Escape sequenzen ersetzen

  Alt 8. Apr 2016, 14:05
Was ist deine Frage?

Magst du was hilfreiches von uns sehen?

Zum Bsp. mit Rekursion:

Delphi-Quellcode:
 // <XYZ> wird ersetzt durch WideChar(XYZ) wenn zum einen die Kombination "<" + "XYZ" + ">" gefunden wird und zum anderen sich "XYZ" in einen Integer umwandeln lässt.
  function ParseLiteralsW(AInputString : WideString) : WideString;

      function WideStrCopy(ASourceString : WideString; AIndex : Cardinal; ALength : Cardinal) : WideString;
      var
        len : Cardinal;
        indx : Cardinal;
      begin
        len:=Length(ASourceString);
        if (AIndex>len) or (ALength=0) then
        begin
          Result := '';
          exit;
        end;
        if AIndex=0 then indx:=1
        else indx:=AIndex;
        if (indx+ALength) > len then
        begin
          SetLength(Result,len-indx+1);
          Move(ASourceString[indx],Result[1],(len-indx+1)*SizeOf(WideChar));
        end else begin
          SetLength(Result,ALength);
          Move(ASourceString[indx],Result[1],(ALength)*SizeOf(WideChar));
        end;
      end;
  
      Function PosExW(SubStr: WideString; S: WideString; Offset : Longint = 1): LongInt;
      Begin
        if Length(SubStr)<=Length(S) then
        begin
          Result := Offset;
          While Length(SubStr) + Result - 1 <= Length(S) do
          Begin
            If CompareMem(@SubStr[1], @S[Result], Length(SubStr) shl 1) Then Exit;
            Inc(Result);
          End;
        End;
        Result := 0;
      End;

  var
    p1,p2 : Integer;
    tmpword : Word;
    tmpw : WideString;
  begin
    Result:=AInputString;
    p1:=1;
    p2:=1;

    p1:= PosExW('<',AInputString,p1);
    p2:= PosExW('>',AInputString,p2);
    if (p1>0) and (p2>0) and (p2>p1+1) then begin
      Try
        tmpword:=StrToInt(WideStrCopy(AInputString,p1+1,p2-p1-1));
        if (tmpword>0) and (tmpword<=MaxWord) then begin
          tmpw:=WideStrCopy(AInputString,1,p1-1)+WideChar(tmpword)+WideStrCopy(AInputString,p2+1,Length(AInputString)-p2);
          Result := ParseLiteralsW(tmpw);
        end;
      except

      End;
    end;
  end;

Zwischenzeitlich kam noch mal dein Beitrag, bis ich einen Fehler gefunden habe. Gut dass es bei dir klappt. Schönes Wochenende!
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.813 Beiträge
 
Delphi 12 Athens
 
#7

AW: Escape sequenzen ersetzen

  Alt 11. Apr 2016, 08:26
Danke für den Code, über kurz oder lang werde ich wohl darauf zurückkommen müssen, je komplexer meine Kommunikation zwischen Server und Client wird. Also vergebens ist das auf keinen Fall gewesen! Danke!

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Escape sequenzen ersetzen

  Alt 11. Apr 2016, 13:20
Es ist immer noch ein Fehler in meinem Beitrag weiter oben. Die Sequenz <60>...<62> wird bei einem rekursiven Aufruf wieder geparsed. Unschön. Deswegen eine kleine Änderung:

Delphi-Quellcode:
  function ParseLiteralsW(AInputString : WideString) : WideString;
  var
    p1,p2 : Integer;
    tmpword : Word;
    tmpw : WideString;
  begin
    Result:=AInputString;
    p1:=1;
    p2:=1;

    p1:= PosExW('<',AInputString,p1);
    p2:= PosExW('>',AInputString,p2);
    if (p1>0) and (p2>0) and (p2>p1+1) then begin
      Try
        tmpword:=StrToInt(WideStrCopy(AInputString,p1+1,p2-p1-1));
        if (tmpword>0) and (tmpword<=MaxWord) then begin //hier die Rekursion
          tmpw:=WideStrCopy(AInputString,1,p1-1)+WideChar(tmpword)+ ParseLiteralsW(WideStrCopy(AInputString,p2+1,Length(AInputString)-p2));
          Result := tmpw;
        end;
      except

      End;
    end;
  end;
Chris
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz