AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wie Textdateien lesen? Unicode oder ANSI
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Textdateien lesen? Unicode oder ANSI

Ein Thema von BlueStarHH · begonnen am 30. Jun 2010 · letzter Beitrag vom 30. Jun 2010
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#1

Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 14:51
Hallo,

ich habe bisher mit AssignFile und ReadLn Textdateien gelesen. Damit kann man leider keine Unicode-Dateien lesen. Nach etwas suchen habe ich das hier gefunden:

Delphi-Quellcode:
var
  Reader: TStreamReader;
begin
  Reader := TStreamReader.Create('C:\Test.txt');
  //Reader := TStreamReader.Create('C:\Test.txt', TEncoding.GetEncoding(28591), false); //Alternative, damit auch deutsche Umlaute dargestellt werden
  while not Reader.EndOfStream do
    Memo1.Lines.Add(Reader.ReadLine);
  Reader.Free;
end;
Das Problem dabei ist, dass dieser Code nur UTF8-Unicode-Dateien lesen kann. Bei normalen ASNI-Dateien wird nichts eingelesen.

Welche Möglichkeiten gibt es eine Textdatei unabhängig davon ob es UTF8 oder ANSI usw. ist einzulesen? Das Format soll also automatisch erkannt werden. Ich habe sehr große Dateien. Das einlesen muss also Zeilenweise passieren und nicht einfach über eine TStringList, die mit LoadFromFile die gewünschte Automatik bietet.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:02
Moin,
geht das nicht mit der Delphi-Referenz durchsuchenTStringList? Abgesehen davon gibt es bei Textdateien ja keinen Header, in den steht, nach welchen Format die kodiert sind.

Das einzige was möglich ist, nach einer Byte Order Mark zu gucken, aber das greift eigentlich nur bei UTF kodierten Texten und selbst dort wird es nicht immer verwendet (Argh der ***** Java Compiler z.B. zerreißt es bei den UTF8 BOM ).

[edit]Ich habe mal bei der Reference geschaut, und dort steht zu der TStrings.LoadFromFile:
Zitat:
If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class.
[/edit]

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (30. Jun 2010 um 15:06 Uhr) Grund: +Links zur Hilfe;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:04
für UTF vorher prüfen ob die ersten drei Byte ef bb bf enthalten?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:06
geht das nicht mit der TStringList?
Gerade damit möchte ich es wie erwähnt nicht machen, weil ich große Textdateien habe und die nicht komplette im Speicher halten möchte.

Das einzige was möglich ist, nach einer Byte Order Mark zu gucken, aber das greift eigentlich nur bei UTF kodierten Texten
Genau an sowas dachte ich. Also wenn eine BOM da ist, wird so eingelesen wie die BOM es angibt. Sonst als ANSI. Wie kann ich das automatisch ermitteln (und ggf. mit dem TStreamReader nutzen)?

Geändert von BlueStarHH (30. Jun 2010 um 15:19 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:07
für UTF vorher prüfen ob die ersten drei Byte ef bb bf enthalten?
Gibts da nichts von Delphi vorgefertigtes für? Ich brauche ja nicht nur UTF8 und ANSI sondern auch die anderen üblichen Kodierungen (UTF7, UTF16, usw). Es muss doch mit Delphi 2010 möglich sein ohne viel Aufwand diese Dateien zeilenweise einzulesen.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:08
Schau dir dafür doch mal TEncoding.GetPreamble an

Nachtrag: Oder gleich TEncoding.GetBufferEncoding ...
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.

Geändert von Deep-Sea (30. Jun 2010 um 15:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:13
Moin,
okay das mit den TStringList hatte ich nicht gelesen, aber dennoch habe ich die Lösung "aus Versehen" zitiert. Und zwar guck doch einfach mal wie das TStrings macht. Dann machst du das genauso.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:33
Hi,

@BlueStarHH:
Mit Deinem Delphi2010, solltest Du aber auch mit TFileStream und TStringStream + Encoding arbeiten können.

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.121 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:48
Wenn es wirklich (fast) nur Zeilenweise sein soll:
http://www.delphipraxis.net/151898-s...ei-reader.html
http://www.delphipraxis.net/151481-t...-einlesen.html
http://www.delphipraxis.net/151934-t...extstream.html

TStringStream, TStringList/TStrings usw. lesen alle die Datei komplett in den Arbeitsspeicher.
Sie können alles dekodieren, welches über TEncoding verfügbar gemacht ist/wird ... also alles.
Standardmäßig kann TEncoding mit Unicode (UTF-16), BigEndian-Unicode, UTF-8, UTF7, Ansi und ASCII umgehn. (wobei ASCII beim Auslesen als Ansi erkannt wird, da es ebenfalls keinen eigenen BOM besitzt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
650 Beiträge
 
Delphi 12 Athens
 
#10

AW: Wie Textdateien lesen? Unicode oder ANSI

  Alt 30. Jun 2010, 15:59
ich habe bisher mit AssignFile und ReadLn Textdateien gelesen. Damit kann man leider keine Unicode-Dateien lesen.
Warum eigentlich nicht? Zugegebenermaßen habe ich es in der Regel mit UTF8-Codierten Dateien zu tun und habe daher jetzt nicht alle anderen Kodierungen präsent, aber für UTF8 kann ich sagen, dass ich AssignFile/readln auch problemlos nutze.

Einziger "Trick" ist, dass man eine neu gelesene Zeile nicht in einen string , sondern in einen RawByteString einliest, damit Delphi nichts von sich aus umzuwandeln versucht.

Damit könntest du dann auch problemlos testen, ob du beim Einlesen in der ersten Zeile zu Beginn einen BOM stehen hast und diesen auswerten. Mit der passenden Konvertierungsfunktion kannst du dann ja jede Zeile einzeln in einen sauberen Unicode-String wandeln.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:56 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