Der kommt per PHP (glob()) aus dem Filesystem.
Yup. Das ist das nächste Problem. PHP greift nur mit der derzeitigen Locale (bei deinem Windows dann wohl cp1252 ) auf das Dateisystem zu. Dieser Zeichensatz muss mann für eine URI dann erstmal nach UTF-8 umkodiert werden, und dann für http das nochmal url-kodieren.
Hier erkennst du auch ein weiteres Problem. Da dein Dateisystem mit UTF8 Dateinamen speichert (ok ist eigentlich unicode), kannst du Dateien haben, die PHP nicht mal einlesen kann, da sich diese Dateinamen nicht in cp1252 abbilden lassen.
Der Apache hat dagegen kein Problem mit einem Zugriff auf diese Dateien, da dieser eh UTF-8 benutzt (unter Windows).
Und jetzt nochmal, warum der Apache je nach OS eine andere URI braucht:
Der Apache greift genau mit dem was du in der URi hast auf das Dateisystem zu.
Wenn du z.B. ein iso-8859-1 Dateisystem hast, wird der Name "Fünf" mit dieser Bytereihenfolge in Hex gespeichert: "46 fc 6e 66" Da man bei diesen Zeichen (Oktets) nur das #fc url kodieren muss, sieht das in einer URI so aus: "F%FCnf"
Wenn du z.B. ein utf-8 Dateisystem hast, wird der Name "Fünf" mit dieser Bytereihenfolge in Hex gespeichert: "46 cr bc 66" Da man bei diesen Zeichen (Oktets) sowohl das #cr und das #bc url kodieren muss, sieht das in einer URI dann so aus: "F%C3%BCnf"
PHP übernimmt den Part dann.
unicode.filesystem_encoding NULL PHP_INI_ALL Available since PHP 6.0.0.
Mal abwarten...
Bisher tut das nur unter *nix und unter Windows stellt sich PHP 6-dev bei Dateisystemzugriffen (namen) genau dämlich an wie die bisherigen Versionen.