Oh ja, daran hab ich noch gar nicht gedacht!
Ich auch nicht, bis ich dann mein wunderbar funktionierendes CMS auf meinen Server hochgeladen hatte. Bei mir lokal funktioniert alles mit UTF-8, was immer wieder zu Fragezeichen oder Kästchen in Systemmeldungen führt.
UTF-8 ist eine wunderbare Idee, und gelobt sei jeder, der es verwendet, aber man muß sich auf den ein oder anderen Sallstrick einstellen.
$string = htmlentities($string, ENT_COMPAT, 'UTF-8');
Exakt, und das funktioniert auch. Allerdings gibt es in PHP keine wirklich native UTF-8 Unterstützung. Idealerweise würde ini_set("default_charset","UTF-8") nicht nur einen entsprechenden Header senden (was ich in meiner sowieso vorhandenen .htaccess mache), sondern auch alle Funktionen mit dem entsprechenden charset arbeiten lassen.
Funktionen die meines Wissens überhaupt nicht sinnvoll mit UTF-8 arbeiten sind chr() und ord(). Wenn du also denkts, du könntest mit diesen hinter einige Fehlerursachen blicken, vergiß es.
Ich möchte hier noch die Funktion posten, die ich verwende, um unabhängig von der codierung des filesystems Sonderzeichen in Dateinamen verwenden zu können:
function myurlencode($mix) {
if (is_string($mix)) {
foreach ($GLOBALS["specialChars"] as $key => $elem) {
$mix = str_replace($key,str_repeat("q",strlen($elem)).$elem,$mix);
}
return $mix;
}
elseif (is_array($mix)) {
foreach ($mix as $key => $elem) {
$out[myencode($key)] = myencode($elem);
}
return $out;
}
else
return $mix;
}
$GLOBALS["specialChars"] ist dabei ein Array, das die Ersetzungspaare in UTF-8 enthält, als z.B. array("ä" => "ae","ö" => "oe") etc. Um diese von normalen Vorkommnissen der Buchstabenkombination unterscheiden zu können, werden so viele "q"'s vorangestellt, wie die Kodierung lang ist, also z.B. qqae oder qqoe.
Ich bin mit dieser Lösung nicht wirklich zufrieden, aber sie funktioniert für den Moment, und mit deutschen Sonderzeichen. Die komplette Bandbreite von UTF-8 bekommt man damit allerdings nur mit einiger Arbeit an den Erstetzungspaaren.
Um die Schnittstelle zum Filesystem flexiebel zu halten, lasse ich alle entsprechenden Funktionen über eine eigene Funktion aufrufen, so kann ich an einem zentralen Punkt alle Fehler beheben.
function fs() {
if ($GLOBALS["disable"]["filesystem"] === TRUE)
return true;
$vars = func_get_args();
$func = array_shift($vars);
$negate = FALSE;
if ($func{0} == "!") {
$func = str_replace("!","",$func);
$negate = TRUE;
}
$vars = myencode($vars);
$ret = call_user_func_array($func,$vars);
$ret = mydecode($ret);
if ($ret == TRUE and $negate == TRUE)
$ret = FALSE;
elseif ($ret == FALSE and $negate == TRUE)
$ret = TRUE;
return $ret;
}
Die Verwendung ist einfach:
Statt fopen("fileName.csv")
schreibt man fs("fopen","fileName.csv")
Mit $GLOBALS["disable"]["filesystem"] lassen sich die Funktionen auch sperren und TRUE zurückgeben. Dies ist nicht bei allen Funtionen sinnvoll, hat sich aber beim Testen von Dateilöschungen oder Verschieben als sehr nützlich erwiesen, da man dann die Datei nicht jedesmal neu anlegen muß, wenn das löschen funktioniert, aber andere Teile der Seite noch nicht.
Hoffe, ich hab dir ein bißchen auf dem Weg zum universellen Zeichensatz helfen können, gib nicht auf!
Grüße
Heizer