XAMPP hat Probleme mit Umlauten

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 10:06

Hallo,

durch ein kleines PHP-Musterscript für die Bildersuche, das ich für jemanden geschrieben habe, bin ich auf ein Codierungsproblem aufmerksam geworden. Ich dachte erst, es läge am Browser, aber es liegt am Apachen im XAMPP.

Wenn man Ressourcen-Pfade, die Umlaute enthalten, anfordert, dann codiert der Browser diese automatisch urlgerecht. Im Apachen, der auf Linux montiert ist, werden die auch automatisch wieder zurückgewandelt in ISO-8859-1. Leider tut das der Apache aus dem XAMPP nicht, sodass dann die Dateien nicht gefunden werden können.

Beispiel: http://testserver.lan/bilder_einbinden/ ... F%FCnf.png

Handelt es sich nun nur um eine fehlende Einstellung oder hat der XAMPP-Apache hier einen Bug?

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Wiedmann » 25. May 2009 10:37

Wenn man Ressourcen-Pfade, die Umlaute enthalten, anfordert, dann codiert der Browser diese automatisch urlgerecht.
werden die auch automatisch wieder zurückgewandelt in ISO-8859-1.

2x nur halbrichtig.

a) zwar codiert der Browser automatisch urlgerecht, aber welchen Zeichensatz er benutzt ist ihm überlassen (und je nach Hersteller ist da ein anderer Default)

b) es wird nur nach ISO-8859-1 "zurückverwandelt", wenn der Browser auch diesen Zeichensatz beim urlencode benutzt hat. Benutzt der Browser z.B. UTF-8, wird nach UTF-8 "zurückverwandelt".

Zur Lösung:
a) man sollte dem Browser nie selbst das urlencode überlassen, sondern das vorher selbst tun.
b) Vor dem urlencode müssen die Zeichen in dem Zeichensatz vorliegen, in dem die Dateien im Dateisystem vorliegen (den also der Apache für den Zugriff auf die Dateien benutzt)
b-1) bei einem *nix Server ist das i.d.R iso-8859-1
b-2) bei einem Windows-Server ist das immer utf-8


Das müsste für einen Windows (oder evlt. auch Linux) - Server, der UTF-8 im Dateisystem benutzt, so aussehen:
http://testserver.lan/bilder_einbinden/bilder/F%C3%BCnf.png
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 10:52

Leider auch nicht richtig.

1. Der Server sendet in seiner Response einen Content Type

Content-Type: text/html; charset=iso-8859-1

Also möchte sich der Browser auch bitteschön daran halten.

2. URL-Codierung kennt nur den eingeschränkten Zeichensatz; das ist ein Subset von ASCII (128).
Es gibt allerdings die Ausnahmeregelung, dass URL-Strings erst UTF-8 codiert werden und dann zusätzlich noch URL-gerecht.
Da die Seite hier aber mit ISO-8859-1 ausgeliefert wird, sollte das nicht in Frage kommen.

3. Ich habe die Codierung URL-gerecht vorgenommen:

if (is_array($_filenames))
{
foreach($_filenames as $key => $path)
{
$urlencoded_path = implode('/',array_map('rawurlencode',explode('/',$path)));

$out .= "<img id=\"img".($key+1+$offset)."\"\r\n".
" class=\"".(($key % 2)?'even':'odd')."\"\r\n".
" src=\"".$urlencoded_path."\"\r\n".
" alt=\"Bild Nr. ".($key+1+$offset)."\">\r\n";
}
}

Das lässt den Apachen im XAMPP trotzdem kalt.

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Xardas der Dunkle » 25. May 2009 11:03

Das Charset des Content-Types, hat absolut gar nix mit dem Charset des Dateinamens zu tun.

Und da deine Scripte nun aber iso-8859-1 kodiert sind spuckt dein Script natürlich auch nach iso-8859-1 kodierte URLs aus.
Nur wird Windows welches UTF-8 erwartet dieses nicht korrekt interpretieren.

Ich weiß schon, wieso ich niemals Sonderzeichen in URLs verwende.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 11:12

Dann hat die Apache-Installation auf Windows also einen Fehler

In den URLs dürfen nach RFC 1738 Abschnitt 2.2 nur die druckbaren Zeichen des ASCII-Zeichensatzes verwendet werden. Alle anderen sollen als Triplets codiert werden. Ist natürlich nun interessant, welcher Byte-Wert nun einem "ü" zugewiesen wird.

Das hat in der Vergangenheit (vor der Einführung von UTF-8) auch immer funktioniert. Es funktioniert auf dem auf LINUX installierten Apache auch einwandfrei. Irgendwie muss da also Einigkeit vorhanden sein.

Wenn mir nun noch jemand erzählen kann, welche Einigkeit denn da vorliegt, könnte man die ja vielleicht auch dem Apachen auf Windows wieder beibringen.

Ich müsste also mal versuchen, den Pfad vorher utf-8 zu codieren und dann erst urlcodieren. Mal sehen, ob es dann auf Windows-Apache auch funktioniert. Ist natürlich hässliche Bastelei

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Xardas der Dunkle » 25. May 2009 11:29

Wobei bei mir ist es so das, nicht unbedingt der Apache sondern der PHP-Interpreter ein Problem mit Sonderzeichen im Dateinamen hat:
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'I:/www/htdocs/localhost/Fäbö.php' (include_path='.;C:\php5\pear') in Unknown on line 0


Code: Select all
<?php
function url2utf8($url) {
    
//$url = utf8_encode($url);
    
return implode('/'array_map('rawurlencode'explode('/'$url)));
}

echo 
'<a href="' url2utf8('Fäbö.php') . '">Test</a>'


Selbes Ergebnis wenn ich damit die URL Kodiere. Wobei ich aufpassen muss, ist die linkgebene Datei selber UTF-8 kodiert, muss ich das kodieren auskommentieren, da ich sonst nur Müll raus und der Apache die Datei auch nicht mehr findet.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 11:32

Interessant!
Doppelt codiert klappt es nun auf dem WinDOSen-Apachen auch.
also erst von ??? nach utf8 codiert mittlels der PHP-Funktion utf8_encode (ich weiß leider nicht, was die als Ausgangscodierung annimmt) und dann weiter codiert mit rawurlencode.

in Einzelschritten:

Code: Select all
   
    $_splitpath = explode('/',$path);
    $_utf8path  = array_map('utf8_encode',$_splitpath);
    $_urlencode = array_map('rawurlencode',$_utf8path);
    $coded_path  = implode('/',$_urlencode);



Das ergibt dann

Code: Select all
http://testserver.lan/bilder_einbinden/bilder/F%C3%BCnf.png


Und das funktionert dann auch.

Fehlt doch trotzdem irgendwo eine Einstellmöglichkeit am HTTP-Server oder gibt's die und ich weiß nur nicht, wie sie heißt?

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 11:36

Xardas der Dunkle wrote:Wobei bei mir ist es so das, nicht unbedingt der Apache sondern der PHP-Interpreter ein Problem mit Sonderzeichen im Dateinamen hat:
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'I:/www/htdocs/localhost/Fäbö.php' (include_path='.;C:\php5\pear') in Unknown on line 0


Code: Select all
<?php
function url2utf8($url) {
    
//$url = utf8_encode($url);
    
return implode('/'array_map('rawurlencode'explode('/'$url)));
}

echo 
'<a href="' url2utf8('Fäbö.php') . '">Test</a>';   


Selbes Ergebnis wenn ich damit die URL Kodiere. Wobei ich aufpassen muss, ist die linkgebene Datei selber UTF-8 kodiert, muss ich das kodieren auskommentieren, da ich sonst nur Müll raus und der Apache die Datei auch nicht mehr findet.


Das Problem steckt aber nun wieder im Browser (zumindest im IE), der ebenfalls darauf eingestellt werden kann, URLs in UTF8 codiert zu senden.
Das ist doch ein heilloses Durcheinander, was uns diese UTF-8-Geschichte beschert!

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Xardas der Dunkle » 25. May 2009 11:44

Erstens benutze ich diese Grausamkeit eines Browsers nicht.
Zweitens hat das Problem wenig mit dem Browser zu tun.

Bei doppelter utf-8 kodierung durch PHP erhalte ich nämlich das:
Code: Select all
<a href="F%C3%83%C2%A4b%C3%83%C2%B6.php">Test</a>

http://localhost/Fäbö.php

und das das nicht funktionieren kann ist ja wohl klar :D
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 12:10

Das ist jetzt aber etwas unkoordiniert.

Wenn man im Browser nochmals die Möglichkeit hat, die Codierung der URLs zu beieinflussen, dann kann irgendwann nichts mehr sitmmen. In soweit hat es dann auch mit dem Browser zu tun.

Aber eigentlich scheint es ein Problem der Kommunikation des Webservers mit dem Filesystem zu sein.

Dazu scheint es hier schon mehr Diskussionen zu geben:
http://community.apachefriends.org/f/viewtopic.php?f=6&t=30039

Dem Apachen fehlt also ein Modul, oder ich habe es noch nicht gefunden. Wenn er bisher hardcoded auf ISO-8859-1 arbeitet, muss er also dazulernen, zumindest die möglichen Codepoints aus UTF-8 des Filesystems hin und her zu transformieren.

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Wiedmann » 25. May 2009 12:26

Da die Seite hier aber mit ISO-8859-1 ausgeliefert wird, sollte das nicht in Frage kommen.

Die Frage ist hier nicht, in welchem Zeichensatz du die Seite im Browser darstellen lässt, sondern in welchem Zeichensatz die Dateien (-namen) im Dateisystem vorliegen. Und genau in diesem Zeichensatz müssen die Dateinamen/Pfade sein, bevor sie url kodiert werden.

3. Ich habe die Codierung URL-gerecht vorgenommen:

In deinem Beispiel gibt es aber wohl noch ein weiteres Problem:
Wo kommt denn der Inhalt von $_filenames her?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 14:31

Der kommt per PHP (glob()) aus dem Filesystem.
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 14:39

Das fehlt also.
PHP übernimmt den Part dann.

    unicode.fallback_encoding NULL PHP_INI_ALL Available since PHP 6.0.0.
    unicode.filesystem_encoding NULL PHP_INI_ALL Available since PHP 6.0.0.
    unicode.http_input_encoding NULL PHP_INI_ALL Available since PHP 6.0.0.
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Re: XAMPP hat Probleme mit Umlauten

Postby Wiedmann » 25. May 2009 15:19

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.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: XAMPP hat Probleme mit Umlauten

Postby xamppman » 25. May 2009 15:49

Und darum wäre der Apache als der Wrapper für alle nachfolgenden Applikationen (Perl, PHP, usw.) auch dafür verantwortlich, die Transformation durchzuführen. DIE CGI-Scripte dürften in diesem Fall auch gar nicht direkt auf das Filesystem zugreifen, sondern müssten eine API im Webserver nutzen. So verstehe ich jedenfalls das Konzept der Entschichtung.

Wenn der Apache weiß, wie das Filesystem codiert ist und wie seine Scripte ticken, dann weiß er auch, wie er Requests behandeln muss. Und nachz außen weiß er ja auch, was er zu antworten hat. Er liefert die Response dann geeignet codiert und tunlichst mit dem passenden Header aus.

Darum kann man aber auf die von mod_autoindex bereitgestellten Links mit Erfolg klicken, weil die immer in utf-8 ausgeliefert werden.
Das klappt allerdings sowohl auf einem Windows, als auch auf einem Linux (mit ISO-8859-1). Es muss also irgendwo schon eine Transformation stattfinden!

Grüße
XM
xamppman
 
Posts: 13
Joined: 15. May 2009 21:18

Next

Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 14 guests