Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#29

AW: UTF8 Literale leserlich machen. Welche Unit / Funktion?

  Alt 25. Jul 2019, 08:08
Hi Zusammen,

ich würde nicht davon ausgehen, dass eine fremde Datenquelle mir saubere Daten schickt,
also habe ich noch zwei Sachen abgefangen:
1) Wenn nach dem "\x" nicht 2 Hex-Werte kommen, sondern nur einer und der String dann endet.
2) Wenn nach dem "\x" nicht 2 Hex-Werte kommen, sondern andere Zeichen und "StrToInt" schief gehen würde.
Delphi-Quellcode:
function DecodeCStyleString(const AStr: String): String;
var
  HexStr : RawByteString;
  ResultStr : RawByteString;
  i : Integer;
  iData : Integer; // Reicht Word?
begin
  i := Low(AStr);
  while (i <= High(AStr)) do
  begin
    if (AStr[i] = '\') then
    begin
      if ((i+3) < High(AStr)) and (AStr[i+1] = 'x') then
      begin
        Inc(i, 2);
        HexStr := '$' + AStr[i] + AStr[i+1];
        if (TryStrToInt(HexStr, iData)) then
        Begin
          ResultStr := ResultStr + AnsiChar(iData);

          Inc(i);
        end else
        begin
          ResultStr := ResultStr + '\x' + AStr[i];
        end;
      end else
      begin
        ResultStr := ResultStr + AnsiChar(AStr[i]);
      end;
    end else
    begin
      ResultStr := ResultStr + AnsiChar(AStr[i]);
    end;

    Inc(i);
  end;

  Result := UTF8ToString(ResultStr);
end;
Drei Dinge bleiben meiner Meinung nach noch zu klären:
1) Wenn der String mit "\xc" endet, könnte man gaaanz weit ausholen und da "\x0c" von machen,
aber will man das noch "abfangen"? Schließlich könnte man soetwas mitten im Text ja auch nicht erkennen!
2) Der Compiler spuckt noch Warnungen aus über Implizite Typ-Umwandlungen. Und Warnungen sind immer ein Hinweis darauf,
dass man etwas nicht richtig gemacht hat. Jetzt ist jemand gefragt, der sich mit Codepages und Zeichensätzen
auskennt. Man könnt das ganze zwar mit explizitem Typecase umgehen, aber das sagt dem Compiler ja
"ich weiß, was ich tue, mach einfach", aber ich weiß hier gerade nicht was ich tue, also seid ihr gefordert!
3) Wie im Kommentar schon zu sehen, aber irgendwie auch Teil von Punkt 2 "Reicht evtl. schon ein Word (2 Byte)
für das TryStrToInt?" Außerdem sagte mal jemand, dass "Integer" je nach EXE-Architektur den Standard-Zahltyp darstellt
("EXE-Architektur" ist sicher das falsche Wort, gemeint ist "Bei einem 64-Bit-Programm ist es ein 64-Bit Wert,
bei einem 16-Bit-Programm nur ein 16-Bit Wert"), aber dass kann jetzt auch von einer anderen
Programmiersprache kommen, oder ein totaler Irrläufer sein!

Außerdem gibt es vermutlich noch 1-2 Dinge zu verbessern, ohne gleich mit Pointern das ganze auf's Maximum zu optimieren.

Viel Spaß noch damit.

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat