2013-08-26 5 views
5

Der Ausgang des folgenden minimalen Beispiels zeigt, dass (auf meinem Linux-Rechner) File :: Glob die unerwartete Nebenwirkung der Umwandlung ein UTF-8-String in Nicht-UTF-8 zu haben scheint:Sollte Perls Datei :: Glob immer durch utf8 :: decode nachfiltert werden?

Dies verursacht falsche
#!/usr/bin/perl 

use utf8; 

use strict; 

my $x = "påminnelser"; 
my $y = glob $x; 

print "x=",utf8::is_utf8($x),"=\n"; 
print "y=",utf8::is_utf8($y),"=\n"; 

Verhalten in meinem Programm. Unter Linux sieht es so aus, als könnte ich es beheben, indem ich utf8 :: decode() nach File :: Glob anwende. Ist das der richtige Weg, das zu beheben? Ist das ein Fehler in File :: Glob? Werden auf anderen Systemen wie Windows korrekte Ergebnisse erzielt?

Antwort

4

Das Codieren von Funktionen, die sich mit Dateinamen befassen, befindet sich derzeit in der ToDo-Liste von Perl: Unicode in Filenames. Das Problem besteht darin, dass einige gängige Betriebssysteme (z. B. Linux) keine Unterstützung für die Kodierung von Dateinamen bieten (abgesehen von den aktuellen Gebietsschema-Einstellungen, die jedoch vom Design abweichen). Daher ist es nicht einfach, eine portable Lösung in Perl zu installieren.

Mein Rat ist, nicht-ASCII-Dateinamen überhaupt zu vermeiden.

+0

Danke für die hilfreichen Informationen, +1. Aber das beantwortet meine Frage nicht, nämlich ob mein Workaround korrekt und/oder ratsam war. Ich möchte meinen Benutzern nicht willkürlich mitteilen, dass sie keine Nicht-ASCII-Dateinamen haben können. –

+0

Es ist nur ratsam, wenn alle Ihre Benutzer utf8 als Kodierung für Dateinamen verwenden. Wenn Sie Benutzer haben, die sagen, no_NO.ISO8859-1 als ihr Gebietsschema und Dateinamen entsprechend diesem Gebietsschema erstellen, dann wird es nicht funktionieren. In diesem Fall müssen Sie raten, vielleicht mit 'Encode :: Guess' oder ähnlichen Modulen. –

+0

Ich sehe. Ich denke also, die Antwort auf meine Frage ist, dass meine vorgeschlagene Problemumgehung eine schlechte Idee ist und wahrscheinlich für einige Benutzer kaputt gehen wird. +1 –