AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

Ein Thema von Maliko · begonnen am 2. Feb 2022 · letzter Beitrag vom 2. Feb 2022
Antwort Antwort
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#1

Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

  Alt 2. Feb 2022, 11:36
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.

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

Geändert von Maliko ( 2. Feb 2022 um 11:40 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
208 Beiträge
 
#2

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

  Alt 2. Feb 2022, 17:09
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
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

  Alt 2. Feb 2022, 19:37
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.

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.

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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

  Alt 2. Feb 2022, 20:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Umlaute nach laden von Textdatei kaputt (Encodingprobleme)

  Alt 2. Feb 2022, 21:28
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);
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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