PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl und Win32: Verarbeitung von Dateinamen mit Umlauten schlägt fehl



Heavy
31-08-2004, 16:57
Hallo Allerseits!

Ich mach nun doch nochmal einen Extra-Thread für mein Problem auf, weil ich einfach nicht weiterkomme.
Ich programmiere eine Perl Anwendung mit ActivePerl-5.8.4.810-MSWin32-x86, die unter Windows 2000 laufen soll. Die Anwendung soll Dateien und zusätzliche Informationen wie z.B. die Dateigröße oder einen CRC-Wert mit Hilfe einer Datenbank verwalten. Die GUI erstelle ich mit Perl Tk.
Mit Hilfe der Dialogbox:


$path=$inpw->getOpenFile();

ermittle ich einen Dateinamen. Für diese Datei will ich dann als erstes die Dateigröße ermitteln. Aber sowohl die Ansätze:



$stats=stat("$path");
$filesize=$stats->size;


als auch



$hFile=createFile("$path","r");
$filesize=SetFilePointer($hFile,0,0,FILE_END);
CloseHandle($hFile);


schlagen bei Dateinamen mit Umlauten fehl. Leerzeichen stellen kein Problem dar. Auch die Ersetzung der Umlaute im Dateinamen mittels



$path =~ s/ä/chr(132)/ge;
usw.


führt leider nicht zum Erfolg. In der Fehlermeldung taucht dann zwar der korrekte Dateiname auf, aber die Datei wird nicht gefunden. Die Dateien mit den Umlauten herauszufiltern und in ein Extra-Verzeichnis zu verschieben, klappt dagegen.


move("$path","$workdir\\umlaute");

Ich habe nun schon alles was mir eingefallen ist probiert und bin im moment ziemlich ratlos. Natürlich gibt es noch die Möglicheit die Dateien umzubenennen, aber das sehe ich als letzten Ausweg an. Für jegliche Hinweise und Ideen zu diesem Problem wäre ich sehr dankbar.

Heavy

peschmae
31-08-2004, 17:30
Ich hab nicht viel Ahnung von Perl und deshalb mal einfach etwas rumgeguckt:



I am searching for a string and it is not found. I know it is there!

Set mv_substring_match to yes (su=yes in one-clicks).

This most commonly happens when searching for non-ISO-8859 (Cyrillic, or characters like umlaut and eacute) characters in word-match mode. The problem is, that unless your locale is set up properly that Perl doesn't think a non-ISO-8859 and a space character is a boundary.

Also, if you are searching for non-alpha characters then they will also not be interpreted as word characters and the boundary problems will still exist.

http://www.ninthwonder.com/info/minivend/faq/all.html

Beschränkt sich dein Problem auf Dateinamen oder hast du das auch allgemein mit Strings mit Umlauten drin?

Falls sich das nicht auf ein "falsches" Setup deinerseits bzw. noch nicht eingestellte Locale zurückführen lässt würde ich das mal freundlichst als Bug bei ActivePerl melden.

MfG Peschmä

Heavy
31-08-2004, 17:58
Hallo peschmae!

Danke für Deine Antwort. Das Problem besteht nur bei den Dateinamen. Ein und derselbe Name wird mit Tk als Label ordentlich angezeigt, aber die Datei wird nicht gefunden. Die Fehlermeldung in der Eingabeaufforderung zeigt aber den Dateinamen nicht korrekt an. Aus "_böse Datei.txt" wird "_b÷se Datei.txt". Wenn ich die Umlaute ersetze, werden die Dateinamen in der Fehlermeldung in der Eingabeaufforderung korrekt angezeigt, aber die Datei wird trotzdem nicht gefunden und im Label wird der Dateiname auch falsch angezeigt. Beim Setup gibt es diesbezüglich keinerlei Auswahl. Mit den setzen der "Locale" bin ich noch nicht klargekommen. Folgendes aus dem Perl-Kochbuch von O'Reilly habe ich probiert:



use POSIX 'locale_h';
@locale{qw(German English)} = qw(de_DE.ISO_8859-1 us-ascii);
setlocale(LC_CTYPE, $locale{German}) or die "Invalid locale $locale{German}";


und folgende Fehlermeldung erhalten:

Uncaught exception from user code: Invalid locale de_DE.ISO_8859-1

An der Stelle komme ich im Moment noch nicht so richtig weiter, werde aber weiterprobieren.

Heavy

Heavy
31-08-2004, 19:36
Ich habe jetzt mit folgenden Anweisungen



use Win32::Locale;
my $language = Win32::Locale::get_language();
my $locale = Win32::Locale::get_locale();
my $ms_locale = Win32::Locale::get_ms_locale();
print "Sprache: $language Locale: $locale MS-Locale: $ms_locale\n";

# Ausgabe
# Sprache: de-de Locale: de_de MS-Locale: 1031


die Sache überprüft. Die ersten beiden Werte sind auf jeden Fall richtig. Den Wert 1031 muß ich noch prüfen, aber ich denke, daß die Locale-Einstellungen auch nicht falsch sind. Ich werde es nun wohl doch mal mit einer Anfrage an ActivePerl probieren, aber es (noch) nicht als Bug deklarieren.

Heavy

Heavy
01-09-2004, 05:03
Ich hab das Problem jetzt auch in der Mailing List perl-win32-users ActiveState Programmer Network (ASPN) gepostet und eine Antwort bekommen, die mich aber noch nicht weitergebracht hat. Sie hat aber verdeutlicht, daß der Fehler im Zusammenhang mit dem von der FileDialogBox zurückgegebenen Dateinamen stehen muß, weil Dateien, die ich explizit im Quelltext mit Namen angebe, korrekt verarbeitet werden, auch wenn die Namen Umlaute beinhalten. Zur Verdeutlichung meines Problems hab ich mal ein kleines Beispiel-Programm erstellt.


use Tk;
use Tk::Menubutton;
my $filename;
my $output;
my $mw=MainWindow->new;
$mw->title("Stat-Test");
$mw->Label(-text=>"Filename",-borderwidth=>2,-relief=>'flat')->pack;
$mw->Label(-textvariable=>\$filename)->pack;
$mw->Label(-text=>"Stats",-borderwidth=>2,-relief=>'flat')->pack;
$mw->Label(-textvariable=>\$output)->pack;
$mw->Button(-text => "Select File",-command=>\&getFileName)->pack;
$mw->Button(-text => "Exit",-command=>sub { $mw->destroy() })->pack;
MainLoop();

sub getFileName
{
$filename=$mw->getOpenFile();
@stats=stat "$filename" or print "Error: $! Filename: $filename\n";
$output=join ",",@stats;
}

Man kann eine Datei auswählen und die Ausgabe von stat wird angezeigt. Bei Auswahl von Dateien mit Umlauten wird der Fehler "No such file or directory" ausgegeben. Vielleicht ist ja jemand so freundlich und kann das mal kurz auf seinem System (Windows 2000) laufen lassen, um zu prüfen, ob der Fehler bei Ihr/Ihm auch auftritt.

Heavy