Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   UTF8Decode gibt kein Resultat zurück (https://www.delphipraxis.net/204887-utf8decode-gibt-kein-resultat-zurueck.html)

stalkingwolf 10. Jul 2020 09:06

UTF8Decode gibt kein Resultat zurück
 
Moin,

ich hab ein etwas nerviges Problem.
Wir erhalten durch JSON von Android Tablets Daten und speichern die in unsere Firebirddatenbank Win1552 Zeichensatz.
Von einigen erhalte ich z.b Stück von anderen Stück.
Jage ich das durch UTF8Decode wird Stück -> Stück, aber die korrekten Strings werden leer von UT8Decode zurückgegeben.

a) warum ?
b) wie fange ich das ab?

Laut unserem Kunden bei dem dies aufgetreten ist meint das alle Tablets das gleiche Modell und die gleiche Android Version hat.
Beide gehen auf das gleiche PHP Script zu welchem die Daten per JSON übergeben werden.

Edit : Die APP ist in FireMonkey mit Delphi 10.2 entwickelt. Das Windows Programm was die Daten auswertet ist mit Delphi 6 entwickelt.

himitsu 10. Jul 2020 09:20

AW: UTF8Decode gibt kein Resultat zurück
 
Wenn da kein gültiges UTF-8 im String drin ist, dann wird wortlos '' zurückgegeben.

Fazit: Bei dir ist da kein UTF-8 drin, sondern irgendwas anderes aus der ANSI-Welt.
Schau dir mal an was da an Zeichen über #127 vorhanden ist.

Lösung:
Delphi-Quellcode:
S := UTF8Decode(A);
if (S = '') and (A <> '') then
  raise Eception.Create('ungültiges UTF-8'); //raise EEncodingError.CreateRes(@SInvalidSourceArray); aus System.SysConst
Bei TEncoding.UTF8.GetString wird dagegen direkt eine Exception ausgelöst.

stalkingwolf 10. Jul 2020 09:46

AW: UTF8Decode gibt kein Resultat zurück
 
Ok die Lösung mit
if (S = '') and (A <> '') then s:=a;
wäre dann bei mir sinnvoll. Ne Exception brauch ich nicht.

Eigentlich war die Lösung logisch, hab Brain Lag wegen 2 Wochen MWST Umstellung. Sinnloseste ABM aller Zeiten.

himitsu 10. Jul 2020 10:19

AW: UTF8Decode gibt kein Resultat zurück
 
Na das ginge och.

Freu dich drauf, wenn es bald wieder zurückgestellt wird.
Und dann nächstes Jahr auf COVID 20.

Delphi-Quellcode:
try
  S := TEncoding.UTF8.GetString(B);
except
  S := TEncoding.ANSI.GetString(B); // oder lieber mit ASCII
end;
Bei uns geht das mit dem ANSI, kommt dann auf's gleiche Ergebnis, wie beim
Delphi-Quellcode:
if (S = '') and (A <> '') then S := A;
.

Aber ich weiß nicht wie sich z.B. die asiatischen ANSI-CodePages verhalten, drum sah es bei mir zum Schluss so aus. :freak:
Delphi-Quellcode:
try
  S := TEncoding.UTF8.GetString(B);
except
  try
    S := TEncoding.ANSI.GetString(B);
  except
    S := TEncoding.ASCII.GetString(B);
  end;
end;
B = TBytes von Indy, Delphi-Referenz durchsuchenTFile, oder aus'm COM-Port

Rolf Frei 10. Jul 2020 12:45

AW: UTF8Decode gibt kein Resultat zurück
 
Gibt übrigens auch noch eine Funktion IsUTF8String (System.WideStrUtils.pas), die hier genutzt werden könnte.

KodeZwerg 10. Jul 2020 13:02

AW: UTF8Decode gibt kein Resultat zurück
 
//offtopic
Zitat:

Zitat von himitsu (Beitrag 1469284)
nächstes Jahr auf COVID 20

Oje, ich hoffe ja immer auf bessere zeiten, das gehört nicht dazu.

stalkingwolf 14. Jul 2020 07:38

AW: UTF8Decode gibt kein Resultat zurück
 
Zitat:

Zitat von himitsu (Beitrag 1469284)
Na das ginge och.
Freu dich drauf, wenn es bald wieder zurückgestellt wird.

Ich hoffe wir haben dafür nun schon alles berücksichtigt. Aber der Teufel ist ein Eichhörnchen.

Zitat:

Zitat von himitsu (Beitrag 1469284)
Und dann nächstes Jahr auf COVID 20.

Hoffen wir das Beste in Deutschland.

Ich weiß auch warum scheinbar einige Sachen nicht in UTF8 waren. Diese wurden per Hand mit SQL Insert in die Datenbank geschrieben per Flamerobin :lol:


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