PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Vorsicht bei der basename() Funktion und Umlauten

with 6 comments

umlauteWieder 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.

Written by Michael Kliewe

April 25th, 2013 at 7:43 am

Posted in PHP

Tagged with , ,

6 Responses to 'Vorsicht bei der basename() Funktion und Umlauten'

Subscribe to comments with RSS or TrackBack to 'Vorsicht bei der basename() Funktion und Umlauten'.

  1. 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

  2. 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

  3. 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

  4. Super Tipp! Danke.

    nikosch

    26 Apr 13 at 15:00

  5. 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

  6. 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

Leave a Reply

You can add images to your comment by clicking here.