ReadXMLFile - Unicode/UTF-8

Rund um die LCL und andere Komponenten
Antworten
aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

ReadXMLFile - Unicode/UTF-8

Beitrag von aXied »

Hallo,

ich habe da wie ich meine ein Unicode/UTF-8 Problem.

Folgende Verzeichnisse existieren (win7 64bit):

1. C:\LüCrosé, водка and ούζο\test.xml
2. C:\üäöß\test.xml
3. C:\LüCrosé,\test.xml

Das Lesen der Datei test.xml aus 2. und 3. funktioniert fehlerfrei.
Hingegen das Lesen aus 1. endet mit dem Fehler "Unable to open file "C:\LüCrosè, ????? and ????\test.xml"."

Tests mit FileExistsUTF8 und den oben angegebenen Dateien funktioniert mit allen Pfaden.

Kann mir jemand einenTipp geben woran das liegen könnte und in welche Richtung ich eine Lösung finden könnte.

Danke schon mal für Eure Hilfe.


Testprogramm: FPC:2.6.2; Laz: 1.0.12

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Dom, XMLRead;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var xmldoc: TXMLDocument;
begin
  ReadXMLFile(xmldoc, UTF8Decode(Edit1.Text));
  xmldoc.Free;
end;
 
end.
 
Zuletzt geändert von Lori am So 29. Dez 2013, 22:26, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von theo »

Man kann mit den aktuellen FPC Funktionen (Soweit ich weiss) auf Windows nur Dateinamen innerhalb des ANSI Systemzeichensatzes laden.
Kein Problem auf Linux und wahrsch. OSX.

Workaround in dieser Art: (aus der Erinnerung)
sn:=ShortFileName(UTF8Decode(OpenDialog1.FileName));

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von Michl »

@Theo: Ich habs mal getestet (mit einem TPicture), funktioniert! (Ich musste allerdings noch UTF8ToConsole aufrufen:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
begin
  Pic.LoadFromFile(UTF8ToConsole(ShortFileName(UTF8Decode('C:\33 Test UTF8\LüCrosé, водка and ούζο\01.jpg'))));
  Repaint;
end;
Sagen müsstest Du noch, dass "function ShortFileName" von Dir ist, siehe: http://www.lazarusforum.de/viewtopic.php?p=37027#p37027 :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von theo »

@Michl: Ja danke. Ich sagte ja "in dieser Art" :wink:

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von aXied »

Hallo Zusammen und erstmal vielen Dank für Eure prompten Antworten.

Der Workaround mit den kurzen Dateinamen funktioniert und ich kann natürlich auch bestätigen, dass unter LINUX diese Problem nicht besteht.

Wenn ich Theo richtig verstanden habe liegt dass noch an fehlenden Implementierungen in den FPC-Sourcen. Ist Euch bekannt ob und wann das nachgeholt werden sollte?
Ich habe auch das selbe/ähnliche Problem wenn ich mit GetEnvironmentVariableUTF8('test') den Wert "C:\LüCrosé, водка and ούζο\test.xml" abfrage.
Auch hier wird mir stattdessen "C:\LüCrosè, ????? and ????\test.xml" geliefert.

Theo's Funktion "ShortFileName" habe ich natürlich im Anschluß schon gefunden. :D

@Michl: Bei mir hat allein die Verwendung der Funktion ShortFileName schon das gewünschte Ergebnis geliefert.

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var xmldoc: TXMLDocument;
begin
  ReadXMLFile(xmldoc, ShortFileName(UTF8Decode(Edit1.Text)));
  xmldoc.Free;
end;
 

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von theo »

aXied hat geschrieben: Wenn ich Theo richtig verstanden habe liegt dass noch an fehlenden Implementierungen in den FPC-Sourcen. Ist Euch bekannt ob und wann das nachgeholt werden sollte?
Ich verfolge das nicht mehr so akribisch.
Vllt. mal hier lesen: http://lists.freepascal.org/lists/fpc-d ... 33039.html

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: ReadXMLFile - Unicode/UTF-8

Beitrag von aXied »

Ok, ich werds weiter verfolgen.

Der Vollständigkeit wegen möchte ich noch die Funktion ExtractShortPathNameUTF8() erwähnen.
Diese Funktion ist ähnlich wie die von Theo und bereits enthalten.

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var xmldoc: TXMLDocument;
begin
  ReadXMLFile(xmldoc, ExtractShortPathNameUTF8(Edit1.Text));
  xmldoc.Free;
end;
 
Zuletzt geändert von Lori am Di 31. Dez 2013, 10:47, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Antworten