AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

Ein Thema von DieDolly · begonnen am 14. Apr 2019 · letzter Beitrag vom 15. Apr 2019
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 14. Apr 2019, 16:47
Spoiler: die Daten wären verloren

Ich komme bei einem Problem nicht weiter. Ich lade mit TFile und TEncoding.UTF8 eine Datei in eine StringList. Ich möchte es jedenfalls.

Aber meine Datei scheint kaputt zu sein.
Die Datei ist laut Notepad++ ohne Encoding. Laut Sublime Western (Windows 1252).

Die Datei hat vor dem Speichern den Inhalt
Zitat:
Ä ʘ Ü
und hat laut Notepad++ wie gesagt danach kein Encoding. Sublime ließt die Datei als
Zitat:
Ä ? Ü
ein.
Ich habe vorerst eine Behandlung eingebaut die auf TEncoding.Default zurückgreift, wenn das Laden in meiner eigenen TFile mit UTF8 fehlschlägt. So bekomme ich ebenfalls das Sublime Ergebnis.

Kann man das schöner behandeln?

Delphi-Quellcode:
 try
  Result := TFile.ReadAllText(Path, TEncoding.UTF8);
 except
  Result := TFile.ReadAllText(Path, TEncoding.Default);
 end;

Geändert von DieDolly (15. Apr 2019 um 12:46 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 10:53
Wenn die Datei Utf-8 ist, aber halt keine BOM hat, versuch mal eine Instanz dieses encodings:

Delphi-Quellcode:
type
  {!
  <summary>
  UTF8 encoding class without BOM, can be used to write files in
  UTF8 encoding without a BOM, e.g. XML or XHTML files.
  </summary>}

  TNoBomUTF8Encoding = class(TUTF8Encoding)
  public
    {!
    <summary>
    Return a zero-elements array to use as a BOM.
    </summary>}

    function GetPreamble: System.TArray<System.Byte>; override;
  end;

function TNoBomUTF8Encoding.GetPreamble: System.TArray<System.Byte>;
begin
  SetLength(Result,0);
end;
Peter Below
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 12:10
Die Datei ist nicht UTF-8. Sie ist Western Windows 1252.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 12:14
Die Datei ist nicht UTF-8. Sie ist Western Windows 1252.
Hier wäre eine Klarstellung notwendig.

Im ersten Post schreibst du, dass
Die Datei ist laut Notepad++ ohne Encoding. Laut Sublime Western (Windows 1252).
Welches Encoding für diese Text-Datei verwendet wurde kann (ohne BOM) nur der Ersteller der Text-Datei zuverlässig mitteilen, alles andere ist reine Spekulation oder basiert auf Vermutungen/Annahmen.

Also: Ist deine Angabe zum Encoding nun eine gesicherte Information vom Ersteller der Datei oder eben diese geschätzte Annahme von Sublime (der trotz dieser Annahme die Datei nicht richtig darstellen kann).

BTW: Jede Textdatei hat ein Encoding. Ohne Encoding ist es keine Textdatei, sondern nur ein Haufen Bytes. Wenn Notepad++ kein Encoding angibt, dann heißt das nicht, es gibt dort kein Encoding, sondern die verwendeten Prüfverfahren von Notepad++ konnten kein Encoding aus der Datei herauslesen.

Geändert von Schokohase (15. Apr 2019 um 12:20 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 12:18
Leider weiß ich nicht wie diese Datei erzeugt wurde.
Ich habe nur noch ein seltenes Exemplar davon auf meinem Computer.

Zitat:
Also: Ist deine Angabe zum Encoding nun eine gesicherte Information vom Ersteller der Datei oder eben diese geschätzte Angabe von Sublime (der trotz dieser Annahme die Datei nicht richtig darstellen kann).
Das ist von Sublime. Ich glaube nicht, dass das Unicodezeichen überhaupt noch in der Datei existiert. Das Encoding fehlt schließlich.

Soll ich die Datei mal hier hochladen? Sie ist 5 Bytes groß (3 Zeichen, 2 Leerstellen), offensichtlich kein Multibyte.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#6

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 12:26
Die brauchst du nicht hochladen, sondern diese 5 Bytes kannst du auch als Hex-Zeichenfolge hier direkt posten.

Gibt es einen Hinweis, was für eine Information diese 5 Bytes beinhalten sollen? Denn bei 5 Zeichen (effektiv 3) ist der Informationsgehalt für Text doch recht dürftig
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.034 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 13:53
Das 3F- Fragezeichen entsteht aber wohl schon weiter hinten in der Kette, denn

Die Datei hat vor dem Speichern den Inhalt
Zitat:
Ä ʘ Ü
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 14:18
Genau und wenn ich die Datei mit UTF8 Encoding laden möchte knallt es. Deswegen try-except und im except dann TEncoding.Default.

Erst gucke ich ob ein BOM vorhanden ist. Wenn nicht prüfe ich jedes Zeichen der Datei (Stream) ob es über #127 hinaus geht. Wenn ja, sind zumindest Zeichen außerhalb der 8 bit vorhanden.
Dann versuche ich mit UTF8 Encoding die Datei zu laden was auch bei vernünftigen Dateien funktioniert. Knallt es dann im Except kommt Default zum Einsatz.

Geändert von DieDolly (15. Apr 2019 um 14:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 15:03
Wenn nicht prüfe ich jedes Zeichen der Datei (Stream) ob es über #127 hinaus geht. Wenn ja, sind zumindest Zeichen außerhalb der 8 bit vorhanden.
Mit dem Test auf #127 erreichst du aber nur 7 Bit. D.h. wenn du eine "Ansi-kodierte" Datei hast (oder Windows 1252, oder eine andere 1-Byte-Kodierung), und du hast Umlaute drin, dann schlägt das schon fehl - denn die sind jenseits von #127. Wenn du dann mit UTF8 dran gehst, dann dürfte es regelmäßig knallen, würde ich vermuten. Oder es kommt zumindest anderweitig Unsinn raus.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.034 Beiträge
 
Delphi 12 Athens
 
#10

AW: Kaputte Datei ohne Encoding mit Umlauten in StringList laden+Zeichen erhalten

  Alt 15. Apr 2019, 15:23
Du könntest die Überprüfung noch etwas verfeinern, in dem du auf eine gültige UTF-8 Kodierung prüfst:
  1. Ist das höchste Bit 0, ist es ein ASCII-Zeichen (entspricht deinem Test)
  2. Sind die höchsten drei Bit eine 110, dann kommt als nächstes ein Folgebyte
  3. Sind die höchsten vier Bit eine 1110, dann kommen als nächstes zwei Folgebyte
  4. Sind die höchsten fünf Bit eine 11110, dann kommen als nächstes drei Folgebyte
  5. Ein Folgebyte hat als höchste zwei Bit eine 10
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:10 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