Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   UTF8 Literale leserlich machen. Welche Unit / Funktion? (https://www.delphipraxis.net/201435-utf8-literale-leserlich-machen-welche-unit-funktion.html)

Sherlock 25. Jul 2019 08:54

AW: UTF8 Literale leserlich machen. Welche Unit / Funktion?
 
Also bei mir kommt so ein Krempel über SOAP rein. Das wird dann hiermit bereinigt und übersetzt:
Delphi-Quellcode:
uses System.JSON;

var myJSONValue:TJSONValue;


 // 'Gl\xC7\, cknerin' -> 'Glöcknerin'
          temp := StringReplace(temp, '\ ', ' ', []);
          temp := StringReplace(temp, '\n', ' ', []);
          temp := StringReplace(temp, '\, ', '', []);
          myJSONValue := TJSONObject.ParseJSONValue(StringReplace(temp.QuotedString('"'), '\x', '\u00',
            [rfReplaceAll]));
          if Assigned(myJSONValue) then
            temp := myJSONValue.ToString;
          temp := StringReplace(temp, '"', '', [rfReplaceAll]);
Und das wars dann schon. Ein paar sinnvolle trys und Frees bitte ergänzen.

Sherlock

Uwe Raabe 25. Jul 2019 09:36

AW: UTF8 Literale leserlich machen. Welche Unit / Funktion?
 
So, ich möchte dann bitte auch nochmal (nur so wegen der Vielfalt):
Delphi-Quellcode:
uses
  System.SysUtils,
  System.Classes;

function DecodeCStyleString(const AStr: String): String;
const
  cLeadIn: TBytes = [$5C, $78]; // '\x'
var
  cnt: Integer;
  source: TBytes;
  target: TBytes;
  i: Integer;
begin
  source := TEncoding.UTF8.GetBytes(AStr);
  SetLength(target, Length(source)); // ausreichend Platz schaffen
  cnt := 0;
  i := 0;
  while (i < Length(source)) do
  begin
    if ((i + 3) < Length(source)) and
       CompareMem(@source[I], @cLeadIn[0], 2) and
       (HexToBin(source, I + 2, target, cnt, 1) = 1) then
    begin
      Inc(cnt);
      Inc(i, 4);
      Continue;
    end;
    target[cnt] := source[i];
    inc(cnt);
    Inc(i);
  end;
  Result := TEncoding.UTF8.GetString(target, 0, cnt);
end;

Schokohase 25. Jul 2019 09:43

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

Ich weiß nicht warum, aber mit dem Code bekomme ich bei Delphi 10.3.2 nur Fehler
Code:
[dcc32 Fehler] Coding.dpr(14): E2029 ')' erwartet, aber ',' gefunden
[dcc32 Fehler] Coding.dpr(28): E2008 Inkompatible Typen
[dcc32 Fehler] Coding.dpr(29): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
Zeile 14 ist die mit der
Delphi-Quellcode:
cLeadIn: TBytes = ($5C, $78); // '\x'
.

Codehunter 25. Jul 2019 09:45

AW: UTF8 Literale leserlich machen. Welche Unit / Funktion?
 
Also was hier IMHO einer Erleuchtung im Wege steht ist der Mangel an zusätzlichen Informationen. Woher kommt der String, was für ein System, ggf. Quell- und Zielcodepages usw. Ein \xc4 und \x80 sagt ja erstmal nichts weiter aus als den Bytewert 196 und 128. Ohne Kenntnis der Codepage kommt man damit nicht weit.

128 lässt sich nach Windows-1251, Windows-1252 und ISO-8859-1 als "€" auflösen, 196 nach ISO-8859-1 als "Ä". Nach CP437 und CP850 kämen dann "├" und "Ç" raus. In Windows-1250 hättest du "Д" und "Ђ". Und so weiter.

Heißt: Um das richtig nach Unicode übersetzen zu können brauchst du die Information, welche 8-Bit-Codepage der Text hatte, BEVOR er in UTF-8 konvertiert wurde.

Uwe Raabe 25. Jul 2019 10:01

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

Zitat von Schokohase (Beitrag 1437596)
Ich weiß nicht warum, aber mit dem Code bekomme ich bei Delphi 10.3.2 nur Fehler

Das kommt davon, wenn man vergisst, den korrigierten Code auch einzufügen. Die jetzige Version sollte funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.
Seite 4 von 4   « Erste     234   

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