Vorsicht bei der basename() Funktion und Umlauten
Wieder ein sehr komischer Bug, diesmal in Zusammenhang mit der Funktion basename():
Die basename() Funktion wird dazu verwendet den letzten Namensteil eines Pfades zurückzugeben. Beispiele:
echo basename('/home/michael/datei.txt'); // -> datei.txt echo basename('/home/michael/ordner'); // -> ordner echo basename('/home/michael/ordner/'); // -> ordner
Funktioniert wunderbar. Auch mit Umlauten innerhalb eines Dateinamens kein Problem:
echo basename('/home/michael/trööööt.txt'); // -> trööööt.txt
Steht aber ein Umlaut am Anfang des Dateinamens, dann gibt basename() einen falschen Dateinamen zurück:
echo basename('/home/michael/öööhhh.txt'); // -> hhh.txt
Autsch! Warum funktioniert die Funktion mit Umlauten in der Mitte, aber nicht am Anfang des Dateinamens?
Einer der beiden Hinweise auf der Manual-Seite gibt die Lösung: basename beachtet die Spracheinstellungen (locale). Ich gucke also nach welche ich aktuell verwende:
var_dump(setlocale(LC_ALL, 0)); // -> string(1) "C"
Es kam zutage dass meine aktuelle Einstellung auf „C“ stand. Stelle ich also die Locale mal mit Hilfe von setlocale() auf einen Mehrbytezeichensatz:
setlocale(LC_ALL, 'en_US.UTF8');
Auf der Konsole unter Linux kann man sich mit dem Befehl
locale -a
die installierten Locales anzeigen lassen. Es muss nur irgendein mehrbytefähiger Zeichensatz sein damit der Bug behoben ist, und en_US.UTF8 ist immer installiert im Gegensatz zu de_DE.UTF8
Und schon ist das Problem behoben, der Dateiname wird korrekt ausgegeben auch wenn ein oder mehrere Umlaute am Anfang stehen.
Bei solchen Artikeln stelle ich mir immer vor, wie der Entwickler (also du) vor seinem Script hockt und die Welt im ersten Augenblick nicht versteht. 😀
Sebastian
25 Apr 13 at 10:46
hatte das selbe Problem mit fgetcsv, da wird auch der Umlaut verschluckt wenn dieser an erster Stelle steht.
Fabi
25 Apr 13 at 20:26
Ich hab mir angewöhnt in jedem Script als erstes ein setlocale(LC_ALL, ‚de_DE.UTF8‘) rein zu hauen. 🙂
Oliver
25 Apr 13 at 20:59
Super Tipp! Danke.
nikosch
26 Apr 13 at 15:00
Das ist kein Bug, das ist ein Feature 🙂 Setlocale kommt immer an erster Stelle vor der Ausgabe… Hab die gleiche Erfahrung gemacht… Aber seitdem ich gettext verwende kamm mir dies nicht mehr unter aufgrunde des Vergessens…
Nico
28 Apr 13 at 20:26
Ohhh ja! Fehlende/nicht gesetzte locale macht komische Dinge. Zum Beispiel funktioniert auch der //TRANSLIT Modifier von iconv nicht ohne korrekte Locale.
Gabriel
29 Apr 13 at 15:50