Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Umlaute nach laden von Textdatei kaputt (Encodingprobleme) (https://www.delphipraxis.net/209864-umlaute-nach-laden-von-textdatei-kaputt-encodingprobleme.html)

Maliko 2. Feb 2022 10:36

Umlaute nach laden von Textdatei kaputt (Encodingprobleme)
 
Moin,

ich hab hier momentan ein sehr merkwürdiges Problem. Und zwar habe ich eine API geschrieben, über welche Base64-codierte Dateien anhand eines JSON-Strings übergeben werden können. Diese Speichere ich dann ganz normal im Dateisystem.

Delphi-Quellcode:
mStream := TBytesStream.Create(TBase64Encoding.Base64.DecodeStringToBytes(mRechnung.Edifakt));

try
  mTempDir := TIniManager.GetIniString('Default', 'TempDir');

  if not DirectoryExists(mTempDir + aMandantid) then
  begin
    ForceDirectories(mTempDir + aMandantid);
  end;

  mStream.SaveToFile(mTempDir + aMandantid + '\' + mRechnung.FileName);
Wenn ich mir die Datei im Windows Editor oder in Notepad++ anschaue, wird mir als Encoding UTF-8 angezeigt. Sowohl im Editor als auch in Notepad++ sind die Umlaute heile.

Wenn ich diese Datei (es ist immer eine Textdatei) nun versuche in eine StringList zu laden, dann sind die Umlaute plötzlich kaputt.

Delphi-Quellcode:
mStringList.LoadFromFile('Pfad zur Datei', TEncoding.UTF8);
Hat vielleicht jemand eine Idee was ich da falsch gemacht habe?

Vielen Dank schon einmal im Voraus.

Viele Grüße
Maliko

Incocnito 2. Feb 2022 16:09

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)
 
Hi Maliko,

da würde ich im ersten Schritt schauen, was für Bytes jetzt tatsächlich in der Datei stehen.
Außerdem ist sicher die Frage interessant: Gibt es ein Byte Order Mark?

Als zweites würde ich schauen, wie die Daten in der Quelle stehen,
oder hast du nur die Base64-Daten.
Wenn ich mich nicht total täusche, sieht das vom Ablauf her aber richtig aus,
so dass der ursprüngliche Text, welcher Base64-Codiert wurde,
tatsächlich dem Ergebnis in der Datei entspricht (auf Byteebene).

Vielleicht kann dir nach der Beantwortung dieser Fragen jemand einen Tipp geben.
Wie gesagt, ich selbst sehe erstmal keinen Fehler.

Mit freundlichem Gruß
Incocnito

Redeemer 2. Feb 2022 18:37

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)
 
Betrifft das große und kleine Umlaute? In Delphi 2009 hatte ich z.B. Probleme mit Umlauten, allerdings nur mit den Großbuchstaben und nur bei UTF8Decode und nicht bei LoadFromStream/File.

Zitat:

Zitat von Incocnito (Beitrag 1501574)
Hi Maliko,

da würde ich im ersten Schritt schauen, was für Bytes jetzt tatsächlich in der Datei stehen.

Richtig, ein Beispiel mit Testdaten wäre gut. Spannend wäre auch, wie er sie lädt.

Zitat:

Zitat von Incocnito (Beitrag 1501574)
Außerdem ist sicher die Frage interessant: Gibt es ein Byte Order Mark?

Das ist aber irrelevant, wenn man TEncoding explizit angibt (wobei der Code fehlt, der das lädt). Wenn die BOM fehlt und er das Encoding nicht explizit beim Laden angibt, kann es ohne BOM zu einem Fehler führen.

Blup 2. Feb 2022 19:32

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)
 
Wie ist den mRechnung.Edifakt entstanden.
War das ursprünglich wirklich ein UTF8-string der in BASE64 umgewandelt wurde oder vieleicht doch nur ein ANSI-string?

Lass das Encoding beim Laden der Stringliste doch mal weg.

KodeZwerg 2. Feb 2022 20:28

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)
 
Vielleicht so?

Delphi-Quellcode:
bytes: TBytesStream;


mStream := TBytesStream.Create(TBase64Encoding.Base64.DecodeStringToBytes(mRechnung.Edifakt));


try

  mTempDir := TIniManager.GetIniString('Default', 'TempDir');
  if not DirectoryExists(mTempDir + aMandantid) then
  begin
    ForceDirectories(mTempDir + aMandantid);
  end;

  TEncoding.GetBufferEncoding(mStream.Bytes, curEncoding);
  if curEncoding <> TEncoding.UTF8 then
    begin
      bytes := TEncoding.Convert(curEncoding, TEncoding.UTF8, mStream.Bytes);
      mStream.Free;
      mStream := TBytesStream.Create(bytes);
    end;

  mStream.SaveToFile(mTempDir + aMandantid + '\' + mRechnung.FileName);


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