Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Dateinamen mit Umlauten (https://www.delphipraxis.net/142989-dateinamen-mit-umlauten.html)

eikeble 7. Nov 2009 11:33


Dateinamen mit Umlauten
 
Hallo zusammen,

ich habe bei lazarus unter Windows das Problem, dass ich keine Dateien öffnen kann, die Umlaute enthalten. Ich habe versucht die UTF8 strings die mir eine OpenDialog liefert per UTF8ToSys in AnsiStrings umzuwandeln. Dies funktioniert auch, ich bekommen wenigstens keinen Fehler mehr. Beim auslesen der Datei aber bekomme ich nur einen leeren String.

Zuerst trat das Problem bei der ReadXMLFile Funktion auf aber auch ein Versuch mit TFileStream löst das Problem nicht.

Gibt es vieleicht irgend einen Trick?
Lazarus: 0.9.28.2Beta
FPC: 2.2.4
Widgetset: Win32

Vielen Dank schon mal.
Gruß

Eike

himitsu 7. Nov 2009 11:37

Re: Dateinamen mit Umlauten
 
Sicher daß der OpenDialog einen UTF-8-String liefert?

In Delphi macht er es nicht
und dort wird ebenfalls bei Utf8ToAnsi ein Leerstring geliefert, wenn der UTF-8-String defekt ist, bzw falls er nicht der UTF-8-Codierung entspricht.

eikeble 7. Nov 2009 12:03

Re: Dateinamen mit Umlauten
 
Ja, ziemlich sicher. Die Konvertierung funktioniert auch einwandfrei. Daran liegt es also leider nicht.

Bernhard Geyer 7. Nov 2009 13:18

Re: Dateinamen mit Umlauten
 
Kann es evtl. ein Bug in Lazarus sein der darauf begründet ist das man die besch*** Entscheidung getroffen hat den Unicode-Datentyp intern als UTF8 zu realisieren? Ich hatte auch mal eine OpenOffice-Beta-Version im test welche auch keine Dateien mit Umlauten lesen konnte.

eikeble 7. Nov 2009 13:29

Re: Dateinamen mit Umlauten
 
Das kann natürlich sein, hilft mir nur ledier nicht wirklich weiter ;-)
Gruß

Eike

JamesTKirk 8. Nov 2009 12:18

Re: Dateinamen mit Umlauten
 
Hi!

Ich weiß nicht was genau du machst, aber folgender Code funktioniert bei mir unter Win32 und Lazarus 0.9.28:

Delphi-Quellcode:
var
  s: String;
  fs: TFileStream;
begin
  if OpenDialog1.Execute then begin
    Memo1.Lines.Clear;
    s := UTF8ToSys(OpenDialog1.FileName);
    fs := TFileStream.Create(s, fmOpenRead);
    try
      Memo1.Lines.LoadFromStream(fs);
    finally
      fs.Free;
    end;
  end;
end;
Eine Datei namens "file-with-ü.txt" wird erfolgreich ausgelesen und in das Memo geschrieben.

Zitat:

Zitat von Bernhard Geyer
Kann es evtl. ein Bug in Lazarus sein der darauf begründet ist das man die besch*** Entscheidung getroffen hat den Unicode-Datentyp intern als UTF8 zu realisieren? Ich hatte auch mal eine OpenOffice-Beta-Version im test welche auch keine Dateien mit Umlauten lesen konnte.

Ich glaub, dass da jeder eine andere Ansicht darüber hat, wer hier jetzt was falsch gemacht hat ;) - und nein, ich möchte hier jetzt keine Diskussion darüber starten.

Gruß,
Sven

Bernhard Geyer 8. Nov 2009 12:31

Re: Dateinamen mit Umlauten
 
Zitat:

Zitat von JamesTKirk
Ich glaub, dass da jeder eine andere Ansicht darüber hat, wer hier jetzt was falsch gemacht hat ;)

Egal ob man nun alle mit Unicode nach UTF16 (Delphi) nimmt oder nach UTF8 (Lazarus) sollte man auf jedenfall dafür sorgen das alle Methdoen das verwenden. Und dein obiges Beispiel zeit das hier Lazarus nicht konsequent ist. Wenn schon UTF8 dann überall. Delphi mit seiner Implementierung (seit D2) kann z.B über einen eigenen Wrapper für TOpendialog einen Widestring bekommen und diese dann der TFileStream.Create-Methode übergeben und die Compilermagic sorgt dafür das Sonderzeichne die in der aktuellen Codepage vorhanden sind auch korregt zur verfügung stehen.

eikeble 8. Nov 2009 12:59

Re: Dateinamen mit Umlauten
 
Vielen Dank für die Hilfe. Habe den Fehler jetzt gefunden. Selten dämlich, wenn die Datei, die man öffnet keine Daten enthält. Dann kann das ja auch nicht funktionieren ;)

Edit: Was wirklich nicht sehr konsequent ist, dass bei einigen Funktionen (z.B.: TPortableNetworkGraphic.SaveToFile() ) die konvertierung schon implementiert ist und somit bei einer doppelten konvertierung ein leerer String entsteht. Meiner Meinung nach entweder immer die konvertierung dem Programierer überlassen oder halt überall schon übernehmen.

Edit2: Noch inkonsequenter ist, dass einige funktionen (ExtratcFileDir() ) Ansistrings und keine UTF8 Strings zurückliefern. Diese müssen also auch wieder nicht konvertiert werden.

Gruß

Eike

JamesTKirk 8. Nov 2009 19:34

Re: Dateinamen mit Umlauten
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von JamesTKirk
Ich glaub, dass da jeder eine andere Ansicht darüber hat, wer hier jetzt was falsch gemacht hat ;)

Egal ob man nun alle mit Unicode nach UTF16 (Delphi) nimmt oder nach UTF8 (Lazarus) sollte man auf jedenfall dafür sorgen das alle Methdoen das verwenden. Und dein obiges Beispiel zeit das hier Lazarus nicht konsequent ist. Wenn schon UTF8 dann überall. Delphi mit seiner Implementierung (seit D2) kann z.B über einen eigenen Wrapper für TOpendialog einen Widestring bekommen und diese dann der TFileStream.Create-Methode übergeben und die Compilermagic sorgt dafür das Sonderzeichne die in der aktuellen Codepage vorhanden sind auch korregt zur verfügung stehen.

Das Problem dieser Inkonsistenz liegt an der zweigeteilten Natur von Lazarus und Free Pascal. Während Lazarus, um die Mehrsprachigkeit bis hin zu Russland, China und Co zu ermöglichen, bereits das komplette Interface auf UTF-8 umgestellt hat, wurde das in RTL und FCL von Free Pascal eben nicht gemacht (deswegen sind auch TFileStream und ExtractFileDir nicht UTF-8-fähig, während TPortableNetworkGraphic Teil der LCL und damit UTF-8-fähig ist). Es wird allerdings vom FPC Team daran gearbeitet dieses Manko mit einem Schwung Compilermagic zu beseitigen.

Gruß,
Sven

Bernhard Geyer 9. Nov 2009 07:05

Re: Dateinamen mit Umlauten
 
Zitat:

Zitat von JamesTKirk
Es wird allerdings vom FPC Team daran gearbeitet dieses Manko mit einem Schwung Compilermagic zu beseitigen.

Und was ist für den Fragesteller die anzustrebende Lösung so das sein Programm nicht mit einen der nächsten Update der RTL/FCL wieder nicht läuft? Oder sollte er nach jedem Update jede UTF8ToSys-Funktionsaufruf checken ob er noch nötig ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 1 von 2  1 2      

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