Entwickler-Ecke

Dateizugriff - Unicode in stringlist / memo


Denis Rotanimret - Di 22.07.03 08:26
Titel: Unicode in stringlist / memo
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 - 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 - 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..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 - 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');                    


Denis Rotanimret - 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 user profile iconChristian S.: Code-Tags hinzugefügt :roll:


AndyB - 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.


Denis Rotanimret - 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 - Mi 23.07.03 11:20

ACHAJ: In Notepad (Win2000) werden die Dateien korrekt angezeigt.


Jelzin - Sa 11.12.04 02:02

Habe exakt das selbe Problem. Kann jemand helfen???


Delete - Sa 11.12.04 02:10

Die standard VCL Komponenten sind generell nicht Unicode fähig.


Jelzin - 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 - 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 (http://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 - Mo 27.12.04 09:33

ElPack schafft Abhilfe :) Thx