Schrift
[thread]8650[/thread]

if(-e $file) und Umlaute.. (Seite 2)

Leser: 3


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
GoodFella
 2007-01-16 19:28
#73269 #73269
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
@PerlProfi: Ich bekomme keine Fehlermeldung, lediglich if(-e $file) evaluiert zu falsch trotz existierender Datei.

@esskar: Also in der von meinem Code generierten Warnung steht der korrekte Pfad + Dateiname..

Habe das Encoding betreffend folgendes gefunden: http://forum.de.selfhtml.org/archiv/2003/1/t34252/

..Hilft mir aber nicht weiter.

@MisterL: Das Problem tritt vor dem Dateiöffnen auf, dieses wird auch gar nicht von mir vorgenommen, sondern intern von Spreadsheet::ParseExcel.

@renee: Die, die bei Perl 5.8.7 (build fällt mir grad nicht ein) bei ist. (bin grad nach Hause gekommen, kanns morgen erst
wieder prüfen, da ich das besagte Script auf der Arbeit mit PAR kompiliert hab.)

@Ronnie: s. PProfi
betterworld
 2007-01-16 20:11
#73270 #73270
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Vielleicht ist der Ort, wo der zu prüfende Dateinamen gespeichert ist (dein Script? oder vielleicht die Kommandozeile?) anders kodiert als perl es erwartet. Wenn das so waere, sollte nicht nur -e nicht funktionieren, sondern gar nichts. Kannst Du die Dateien denn mit perl oeffnen/loeschen/etc?
GoodFella
 2007-01-16 21:21
#73271 #73271
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,16.01.2007, 19:11]Vielleicht ist der Ort, wo der zu prüfende Dateinamen gespeichert ist (dein Script?  oder vielleicht die Kommandozeile?) anders kodiert als perl es erwartet.  Wenn das so waere, sollte nicht nur -e nicht funktionieren, sondern gar nichts.  Kannst Du die Dateien denn mit perl oeffnen/loeschen/etc?[/quote]
Wie schon erwähnt, funktioniert es alles perfekt, solange keine Umlaute im Dateinamen sind. Ich kann Dateien im selben Verzeichnis öffnen / bearbeiten etc..
ptk
 2007-01-16 21:34
#73272 #73272
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es ist sehr wahrscheinlich, dass getOpenFile Probleme mit Umlauten hat. Ich habe schon ein ähnliches getOpenFile-Problem beheben müssen.

Wahrscheinlich funktioniert es, wenn du den Dateinamen wieder im System-Encoding zurückwandelst. Also:
Code: (dl )
Encode::encode("iso-8859-1", $dateiname)
oder ein Windows-Charset, je nachdem, was du benutzt.
GoodFella
 2007-01-17 06:23
#73273 #73273
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,16.01.2007, 20:34]Es ist sehr wahrscheinlich, dass getOpenFile Probleme mit Umlauten hat. Ich habe schon ein ähnliches getOpenFile-Problem beheben müssen.

Wahrscheinlich funktioniert es, wenn du den Dateinamen wieder im System-Encoding zurückwandelst. Also:
Code: (dl )
Encode::encode("iso-8859-1", $dateiname)
oder ein Windows-Charset, je nachdem, was du benutzt.[/quote]
Hab jetzt ein paar Tests gemacht:
Zum einen lässt sich das Problem bei mir reproduzieren:
Perl v5.8.8 build 819
Tk 804.027-r6

Zum anderen habe ich encoding ausprobiert. War natürlich neugierig, welchen Unterschied der anders kodierte String aufweist:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
@types =( ['All files',         '*'],
          ['CSV files',      '.csv'],
          ['Excel files',    '.xls'] );
$value = $parent->getOpenFile( -filetypes => \@types, -initialdir => '.' );
print ord($_).':' for(split(//,$value));
print "\n";
$value = encode("iso-8859-1", $value);
print ord($_).':' for(split(//,$value));
print "\n";


Nun, es gibt keinen und der Fehler lässt sich so auch nicht beheben... vielleicht liegt es an der Art des encodings? Woher weiss ich, welches encoding -e file erwartet und welches mir getOpenFile zurückgibt?

Achja, Datei kurz öffnen und schliessen geht fehlerlos, prüft zwar nicht nur auf Existenz, aber wäre ein Workaround. Fragt sich nur, warum -e file anders funktioniert als open.

Die Testdatei heisst übrigens "hälölüßer_test.xls"


..Das alles deutet übrigens daraufhin, dass nur -e file Probleme mit Umlauten hat, getOpenFile jedoch korrekt arbeitet (bis auf dass es in Windows-Pfadangaben Slashes statt Backslashes zurückgibt und Button-1-Events an das darunterliegende Widget weiterleitet)

[edit]
Code: (dl )
1
2
3
4
5
C:\Xitami\cgi-bin\mailsmore\PostEnhance>perl -e "if (-e 'hälölüßer_test.xls') {
print qq(existiert\n) }"
existiert

C:\Xitami\cgi-bin\mailsmore\PostEnhance>


..Bei Benutzung von perl -e in cmd funktioniert es. Merkwürdig.\n\n

<!--EDIT|GoodFella|1169008502-->
sesth
 2007-01-17 08:57
#73274 #73274
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Benutze statt encode mal
Code: (dl )
utf8::downgrade($value);

dann sollte es gehen.
Gruß
Thomas
GoodFella
 2007-01-17 09:44
#73275 #73275
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=sesth,17.01.2007, 07:57]Benutze statt encode mal
Code: (dl )
utf8::downgrade($value);

dann sollte es gehen.[/quote]
Leider nicht, habs getestet :(
sesth
 2007-01-17 09:54
#73276 #73276
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hmm, bei mir funktioniert dies Beispiel mit Umlauten im Dateinamen (Perl 5.8.8 build 817):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use Tk;
use strict;

my $top = MainWindow->new();

my @types =( ['All files', '*'],
['CSV files', '.csv'],
['Excel files', '.xls'] );
my $value = $top->getOpenFile( -filetypes => \@types, -initialdir => '.' );

utf8::downgrade($value);

if (-e $value) {
print qq(existiert\n);
} else {
print $value, "\n";
}

liefert:
existiert
Gruß
Thomas
GoodFella
 2007-01-17 10:11
#73277 #73277
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Hab auch mal ein TestScript geschrieben:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use Tk;
use strict;

my $top = MainWindow->new();

my @types =( ['All files',         '*'],
             ['CSV files',      '.csv'],
             ['Excel files',    '.xls'] );
my $value = $top->getOpenFile( -filetypes => \@types, -initialdir => '.' );
my $check = $value;
utf8::downgrade($value);

if (-e $value)
 {
  print "value existiert\n";
 }
else
 {
  print "value existiert nicht\n";
 }

if (-e $check) 
 {
  print "check existiert\n";
 }
else
 {
  print "check existiert nicht\n";
 }

print ord($_).':' for(split(//,$value));
print "\n";
print ord($_).':' for(split(//,$check));
print "\n";

print "$value\n$check";


Liefert:
Quote
---------- Perl ----------
value existiert
check existiert nicht
67:58:47:88:105:116:97:109:105:47:99:103:105:45:98:105:110:47:109:97:105:108:115:109:111:114:101:47:80:111:115:116:69:110:104:97:110:99:101:47:104:228:108:246:108:252:223:101:114:95:116:101:115:116:46:120:108:115:
67:58:47:88:105:116:97:109:105:47:99:103:105:45:98:105:110:47:109:97:105:108:115:109:111:114:101:47:80:111:115:116:69:110:104:97:110:99:101:47:104:228:108:246:108:252:223:101:114:95:116:101:115:116:46:120:108:115:
C:/Xitami/cgi-bin/mailsmore/PostEnhance/hälölüßer_test.xls
C:/Xitami/cgi-bin/mailsmore/PostEnhance/hälölüßer_test.xls


Habe dann nachgeforscht, warum es das erste Mal nicht ging.. Mein Hauptscript schreibt $value in eine Listbox und holt den Wert von da wieder heraus; ist wohl unterwegs das encoding wieder verloren gegangen. Schreibe ich utf::downgrade direkt vor den Dateitest, gehts :)
Danke.

Fragt sich, woran ich den Unterschied in der Kodierung erkennen kann, an den chr() Codes jedenfalls nicht, denn die sind gleich.\n\n

<!--EDIT|GoodFella|1169021578-->
sesth
 2007-01-17 10:18
#73278 #73278
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Perl verwaltet intern ein UTF-8 Flag in der Variablen, damit beim gemischten Betrieb automatisch das korrekte Encoding verwendet wird. Du kannst mit
Code: (dl )
utf8::is_utf8(STRING)
das Flag testen. Das Encode-Modul stellt diese Funktion auch bereit.
Gruß
Thomas
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2007-01-16 17:12.