Einzelnen Beitrag anzeigen

Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#1

Windows 10: Unicode UTF-8 Einstellung verwenden

  Alt 7. Apr 2020, 15:52
Hallo zusammen,

wir haben schon länger Probleme mit unserer Software bei einigen unserer Kunden und haben letzte Woche herausgefunden, dass es mit der Unicode UTF-8 Unterstützung von Windows zusammenhängt. Wenn die Einstellung "Beta: Unicode UTF-8 für die Unterstützung weltweiter Sprachen verwenden" aktiviert ist, erzeugt unsere Software Fehler. Hier mal ein Beispiel, was zu einem Fehler führt:

Unsere Software benutzt eine Fremdkomponente zum Einlesen von png-Dateien. Darin enthalten ist folgender Code (ich habe den Code etwas angepasst, um ihn auf das Wesentliche zu beschränken):
Delphi-Quellcode:
...
type
  TChunkName = array [0..3] of AnsiChar;
...

procedure LoadFromStream(Stream: TStream); // der Stream enthält den Inhalt der png-Datei
var
  name: TChunkName;
begin
  Stream.Read(name, 4);
  if name <> '‰PNG'
    then raise Exception.Create('Ungültiges PNG');
  ...
end;
Ist die Unicode UTF-8 Einstellung in Windows deaktiviert, funktioniert alles wunderbar.

Wegen dem Problem habe mich in den letzten Tagen etwas ausführlicher mit Zeichensätzen und Zeichencodierung auseinander gesetzt, mir ist aber immer noch nicht ganz klar, was da passiert (vor allem auch in Windows) und wie man das Problem denn nun eigentlich lösen kann.

Ich habe mir mal ein Tool geschrieben, das den erwarteten String (also ‰PNG) und den tatsächlich eingelesenen String in einer Datei speichert, wenn man die ersten 4 Zeichen eines gültigen PNGs einließt. Wenn die Windows Einstellung aktiviert ist, dann werden in der Datei folgende Zeichen gespeichert (kodiert mit UTF-16 (LE)):

Code:
Erwartet (‰PNG): 30 20 50 00 4E 00 47 00
Tatsächlich:     FD FF 50 00 4E 00 47 00
Nun zu meinen Fragen:

1. Warum wird für das erste Zeichen FD FF eingelesen/in die Datei geschrieben?
2. Wie lässt sich das Problem lösen, so dass der Code keinen Fehler mehr liefert, egal, ob die Windows Unicode UTF-8 Einstellung aktiviert oder deaktiviert ist?

Ich habe da an eine Winapi Funktion gedacht, mit der man die Unicode UTF-8 Einstellung für die eigene Anwendung deaktivieren kann, habe bisher aber nichts in dieser Richtung gefunden. Meine aktuelle Befürchtung ist, dass alle Code-Stellen, die explizit AnsiString benutzen, irgendwie umgeschrieben werden müssen, da ich jedoch davon ausgehe, dass es einige Stellen gibt, hoffe ich, dass es eine praktischere Lösung gibt.

Geändert von Scurra ( 7. Apr 2020 um 15:55 Uhr)
  Mit Zitat antworten Zitat