| Autor |
Beitrag |
Denis Rotanimret
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 22.07.03 08:26
Hi!
Ich habe eine Text-Datei im Unicode Format und möchte diese in eine StringList laden. Leider werden dabei die Sonderzeichen (ü,ö,ä,Ü,Ä,Ö,ß) falsche angezeigt bzw. geladen. Wie kann ich dies umgehen? Bzw. wie kann ich eine Unicode-Textdatei in eine StringList mit korrekten Sonderzeichen laden?
Wäre für Hilfe sehr dankbar. Denis
(Delphi7,Win2000)
|
|
specialwork
      
Beiträge: 52
Windows XP Professional; Windows Server 2003
Delphi 7 Prof, Delphi 8.Net
|
Verfasst: Mi 23.07.03 00:14
Titel: Zeichensatzkonvertierung
Hallo, Denis Rotanimret
Suche mal in der Delphi Hilfe nach "Zeichensatzkonvertierung". Dort findet man einige Hinweise zur Konvertierung von Unicode, UTF, usw., -Strings.
Allerdings dürfte man Performanceprobleme erleiden, wenn man die Unicode-Datei zuvor konvertieren muß. Das bedeutet, daß man die Datei zuerst in eine TStringlist laden, und sie dann Zeile für Zeile konvertieren muß.
Bestimmt gibt es noch eine alternative Möglichkeit, die mich auch interessieren würde.
Gruß, Tom
|
|
Denis Rotanimret 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 23.07.03 07:42
Hab schon die Delphi-Hilfe von oben bis unten abgesucht. Die Performance ist kein Problem...Ich habe Zeit. Hab auch schon versucht die Dateien vorher Zeile für Zeile zu konvertieren, aber ich habe für die Konvertierung einer Zeile einfach keine passende Funktion gefunden. Z.B. hab ichs schon so probiert. Aber hier bekomm ich ne Fehlermeldung, wg. inkompatiblen Typen...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure Konvertieren(var text:TStrings); var i,j:integer; zeile:string; unicodetext:Array[0..8192] of PChar; begin for i:=0 to text.count-1 do begin zeile:=a1[i]; for j:=0 to length(zeile) do unicodetext:=unicodetext+PChar(zeile[i]); zeile:=WideCharToString(unicodezeile); a1[i]:=zeile; end; end; |
Hat jemand einen Vorschlag wie man genau eine Konvertierung bewerkstelligen könnte? Bin irgendwie zu blöd.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 23.07.03 09:50
| Denis Rotanimret hat folgendes geschrieben: | | unicodetext:=unicodetext+PChar(zeile[i]); |
Du kannst ja auch nicht einen String zu einem Array "addieren". String <> Array => inkompatiblen Typen
Hier mal eine Funktion mit der du einen komplette UniCode formatierte Textdatei in einen WideString einlesen kannst.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function ReadFileToWideString(const Filename: string): WideString; var Stream: TFileStream; begin Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite); try SetLength(Result, Stream.Size div SizeOf(WideChar)); Stream.Read(Result[1], Stream.Size); finally Stream.Free; end; end; |
Damit geht es ganz einfach, da Delphi per Compiler Magic die Konvertierung vornimmt.
Delphi-Quelltext 1:
| StringList.Text := ReadFileToWideString('C:\Test.txt'); |
_________________ Ist Zeit wirklich Geld?
|
|
Denis Rotanimret 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 23.07.03 10:04
Danke für dir Hilfe. Hab die Funktion eingebaut und damit stringlist.LoadFromFile ersetzt. Wenn ich die StringLists jetzt z.B. in einem Memofeld ausgebe kommt nur folgendes:
Quelltext 1:
| ??????????????????????‰??????????????????????????????????????????????4????????????????????????????????=????????????????????????????????????????????????????????????????????????????????????????????????????????????†?????†?Z?????????????????????????????????†??????????????????????????????????????????????????????????????????????????????????????????????????????????????.... |
Woran kann das liegen? Meine StringList ist als TStrings definiert.
Denis
Moderiert von Christian S.: Code-Tags hinzugefügt 
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 23.07.03 11:09
Es handelt sich hoffentlich schon um eine lateinische Schrift? Denn ANSI kann nur einen Teil von Unicode darstellen und diese Zeichen sind dann von der aktuellen Codepage abhängig. Ein chinesisches Schriftzeichen wirst du unter einen deutschen Windows nicht ohne eine ensprechende Chinesische Schiftdatei + Codepage anzeigen können.
Woher kommt diese Unicode Datei? Hast du sie mit Notepad erzeugt? Wenn ja, dann sind alle Zeichen um 1 Byte verschoben, womit natürlich Unsinn herauskommt.
_________________ Ist Zeit wirklich Geld?
|
|
Denis Rotanimret 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 23.07.03 11:18
Es handelt sich um Deutsche pur => Schrift (Latein). Konkret hatte ich über UrlDownloadToFile Unicode-codierte Websites heruntergeladen und wollte die nun mit meinen Programm bearbeiten, was aber bisher nur normale Ansi-Codierte Websites bearbeitet hat.
|
|
Denis Rotanimret 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 23.07.03 11:20
ACHAJ: In Notepad (Win2000) werden die Dateien korrekt angezeigt.
|
|
Jelzin
      
Beiträge: 30
|
Verfasst: Sa 11.12.04 02:02
Habe exakt das selbe Problem. Kann jemand helfen???
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 11.12.04 02:10
Die standard VCL Komponenten sind generell nicht Unicode fähig.
|
|
Jelzin
      
Beiträge: 30
|
Verfasst: Sa 11.12.04 13:31
Aber es muss doch ne Möglichkeit geben eine Datei die im Unicode-Format vorliegt in Ansi für normale String-Verarbeitung umzuformatieren?
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Sa 11.12.04 18:39
| Jelzin hat folgendes geschrieben: | | Aber es muss doch ne Möglichkeit geben eine Datei die im Unicode-Format vorliegt in Ansi für normale String-Verarbeitung umzuformatieren? |
Für die verarbeitung von Unicode-Fähigen Textdateien benötigst Du eine Unicode-Fähige Stringliste, wie sie die TNT-Controls oder das ElPack ( www.lmd.de/products/lmdelpack/) bietet.
Falls die Textdatei "nur" UTF-8-Codiert ist (was vermutlich bei dir der Fall ist, da nur die Sonderzeichen falsch geladen werden), so kommst Du auch mit den Delphi-Bordmitteln aus. Du mußt nur die eizelnen Zeilen mit UTF8Decode wieder dekodieren (Funktion ist AFAIK in SysUtils.pas).
|
|
Jelzin
      
Beiträge: 30
|
Verfasst: Mo 27.12.04 09:33
ElPack schafft Abhilfe  Thx
|
|