Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi 10.4 unter Linux -Unicode Encoding problem (https://www.delphipraxis.net/204564-delphi-10-4-unter-linux-unicode-encoding-problem.html)

Harry Stahl 7. Jun 2020 01:02

Delphi 10.4 unter Linux -Unicode Encoding problem
 
Wenn ich ein größeres Projekt unter Linux mit Indy compiliere und starte, erhalte ich

- ETFontGlyManagerException
- EIDConnectionStateError
- EThreadNameException

Unter 10.3.3 war das nicht

Während man das noch einfach ignorieren kann, funktioniert unter 10.4 beim abrufen einer Mail das nicht mehr:

Delphi-Quellcode:
 DMI.IMAP41.RetrieveNoDecodeToStream(StrToInt(GetFieldStr (#1, slGetMail[x], 2)), ts);
 ts.position := 0;
 slHlp.LoadFromStream(ts);
Hier steigt das Programm aus (--> LoadFromStream, --> SetTextStr (Encoding.GetString --> in Zeile 33442 wird dann in der System.SysUtils ein Error geschmissen :

Delphi-Quellcode:
TEncoding.Getstring...

 if (ByteCount > 0) and (Len = 0) then
    raise EEncodingError.CreateRes(@SNoMappingForUnicodeCharacter);
Die Meldung lautet dann "No mapping for the Unicode character exists in the target multibyte code page".

Danach hängt sich das Programm radikal auf, mit Ach und krach kann ich dann noch die Programme runterfahren und die Virtuelle Maschine neu starten (aber selbst bei Linux muss ich mich erst mal ab und neu anmelden).

Wie gesagt, unter 10.3.3 habe ich das Problem nicht. Debuggen gestaltet sich zudem insgesamt sehr hakelig.

Jemand eine Idee, wo das Problem liegen könnte und wie man das beheben kann?

Harry Stahl 7. Jun 2020 11:56

AW: Delphi 10.4 unter Linux -Unicode Encoding problem
 
Ich vermute mal (meine es gab auch mal so eine Diskussion), das man das "Guessing" für Encondings nun evtl. abgeschafft hat (also das raten, welches Encoding der zu lesende Text hat, wenn kein BOM im Text drin ist).

Das war vormals schon so bei TStrings.loadfromfile (Datei, Encoding), wo man nur (oder sagen wir mal einfach) mit Try Except rausfinden konnte, ob ein Text nun Ansi oder UTF8 ist.

Beim Loadfromstream, hatte es (wenn ich mich nicht täusche) aber funktioniert, wegen des noch enthaltenen Guessings?

Wie auch immer, was die genauen Ursachen sind, konnte ich nicht wirklich erkunden, aber wenn ich es jetzt so mache:

Delphi-Quellcode:
 ts.position := 0;

 try
   slHlp.LoadFromStream(ts, TEncoding.UTF8);
 except
   ts.Position := 0;
   slHlp.LoadFromStream(ts, TEncoding.Ansi);
 end;
wird unter

funktioniert es...

Muss jetzt also alle Stellen abchecken, wo ich ein Loadfromstream drin habe und potentiell unklar ist, welches format der einzulesende Text hat...

Interessantwerweise funktioniert unter Windows weiterhin

slHlp.LoadFromStream(ts);

auch, wenn der Stream einen ANSI-Text enthält. Wie es sich unter MACOS stellt, habe ich noch nicht ausprobiert...

Alternativ könnte es auch sein, dass man das DefaultEncoding für Linux geändert hat.

Immer wieder schön, wie man 3-4 Stunden Zeit vertun kann...:cry:

Nachtrag: Ja, auch unter MacOS muss ich das anpassen, sonst gibt es eine entsprechende Meldung...

Na ja, unter MAC tröstet mich jetzt aber die Verwendung von Metal, was die Anzeige echt extrem beschleunigt, vor allem auf Retina Monitoren...:-D Insofern lohnt der Umstieg auf 10.4 allemal...

Uwe Raabe 7. Jun 2020 13:16

AW: Delphi 10.4 unter Linux -Unicode Encoding problem
 
Zitat:

Zitat von Harry Stahl (Beitrag 1466642)
Ich vermute mal (meine es gab auch mal so eine Diskussion), das man das "Guessing" für Encondings nun evtl. abgeschafft hat (also das raten, welches Encoding der zu lesende Text hat, wenn kein BOM im Text drin ist).

Ich kann mich nicht erinnern, daß es so ein Guessing überhaupt gab. Wenn kein BOM vorhanden ist, wird das Default-Encoding genommen. Das war und ist unter Windows ANSI und unter Posix UTF-8 (außer man hat TStrings das DefaultEncoding explizit zugewiesen):
Delphi-Quellcode:
class function TEncoding.GetDefault: TEncoding;
begin
{$IFDEF MSWINDOWS}
  Result := ANSI;
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  Result := UTF8;
end;
{$ENDIF POSIX}

Harry Stahl 7. Jun 2020 13:28

AW: Delphi 10.4 unter Linux -Unicode Encoding problem
 
Ja, kann sein, dass ich das mit dem Guessing mißverstanden hatte, dass die Aussage eher war, man wolle es nicht einführen (im Zusammenhang mit BOM_Less UTF8-Dateien).

Jedenfalls verhält sich hier 10.4 anders als 10.3.x, warum genau das so ist, weiß ich nicht, aber mit der von mir beschriebenen Vorgehensweise kann man ja zurecht kommen.

Bernhard Geyer 7. Jun 2020 13:39

AW: Delphi 10.4 unter Linux -Unicode Encoding problem
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1466645)
Zitat:

Zitat von Harry Stahl (Beitrag 1466642)
Ich vermute mal (meine es gab auch mal so eine Diskussion), das man das "Guessing" für Encondings nun evtl. abgeschafft hat (also das raten, welches Encoding der zu lesende Text hat, wenn kein BOM im Text drin ist).

Ich kann mich nicht erinnern, daß es so ein Guessing überhaupt gab.

Windows Notepad macht sowas.
Evtl. das noch in erinnerung gehabt.
Für Delphi VCL (FMX) wäre mir das neu.

Harry Stahl 7. Jun 2020 15:01

AW: Delphi 10.4 unter Linux -Unicode Encoding problem
 
OK, alles zurück auf Anfang:

Habe es noch mal mit alten Versionen gegengecheckt, das Verhalten von 10.3.x und 10.4 ist doch gleich, hatte es schlicht bei den Tests nicht mitbekommen, da ich an einer Stelle eine Exception zuviel verschluckt habe (bei Mail-Empfang mit Indy muss man ja nicht wirklich alles ausgeben, aber so hatte ich bei Empfang von ANSI-Mails [die ja nicht mehr so oft vorkommen] den Encoding-Error nicht mitbekommen...).

Also shame on me, mit 10.4 ist da alles OK... (Gott sei Dank, habe mich schon so dran gewöhnt)


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