Autor Beitrag
Denis Rotanimret
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52

Windows XP Professional; Windows Server 2003
Delphi 7 Prof, Delphi 8.Net
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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...

ausblenden 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..8192of 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.
ausblenden 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.
ausblenden Delphi-Quelltext
1:
StringList.Text := ReadFileToWideString('C:\Test.txt');					

_________________
Ist Zeit wirklich Geld?
Denis Rotanimret Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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:

ausblenden Quelltext
1:
??????????????????????‰??????????????????????????????????????????????4????????????????????????????????=????????????????????????????????????????????????????????????????????????????????????????????????????????????†?????†?Z?????????????????????????????????†??????????????????????????????????????????????????????????????????????????????????????????????????????????????....					


Woran kann das liegen? Meine StringList ist als TStrings definiert.

Denis

Moderiert von user profile iconChristian S.: Code-Tags hinzugefügt :roll:
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 23.07.03 11:20 
ACHAJ: In Notepad (Win2000) werden die Dateien korrekt angezeigt.
Jelzin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 11.12.04 02:02 
Habe exakt das selbe Problem. Kann jemand helfen???
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.12.04 02:10 
Die standard VCL Komponenten sind generell nicht Unicode fähig.
Jelzin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mo 27.12.04 09:33 
ElPack schafft Abhilfe :) Thx