PHP Rätsel: Wieso hat das Umlaute Array nur 35 Einträge?


Ich arbeite gerade an einer Funktion mit der man String, die mit PHP htmlentities() Funktion Umgewandelt worden sind:

Rauml;tsel

zurück zu wandeln in

Rätsel

weil jemand die Werte so in die Datenbank gespeichert hat, wahrscheinlich ich :)

Dazu hab ich die folgende Funktion gebaut, die mir komischerweise ein Array durchläuft, dass nicht die Werte beinhaltet, die man erwarten würde:

HtmlEntitesReplacer::displayHtmlEntities();
class HtmlEntitesReplacer
{

    public static function displayHtmlEntities()
    {
        $i = 0;
        $umlaute = HtmlEntitesReplacer::getUmlauteArray();
        echo "Das Umlaute Array hat ".count($umlaute)." Werte<br>";
        foreach($umlaute  as $umlautFalsch  =>$umlaut)
        {
            $htmlEnties = str_replace("&amp;", "&amp;amp;",htmlentities($umlaut));
            echo "$i) $umlautFalsch <=> $htmlEnties' <=> $umlaut <br> ";
            $i++;
        }
        die();
    }

    private function getUmlauteArray()
    {
        return array(
            'ü'=>'ü',
            'ä'=>'ä',
            'ö'=>'ö',
            'Ö'=>'Ö',
            'ß'=>'ß',
            'Ã '=>'à',
            'á'=>'á',
            'â'=>'â',
            'ã'=>'ã',
            'ù'=>'ù',
            'ú'=>'ú',
            'û'=>'û',
            'Ù'=>'Ù',
            'Ú'=>'Ú',
            'Û'=>'Û',
            'Ãœ'=>'Ü',
            'ò'=>'ò',
            'ó'=>'ó',
            'ô'=>'ô',
            'è'=>'è',
            'é'=>'é',
            'ê'=>'ê',
            'ë'=>'ë',
            'À'=>'À',
            'Á'=>'Á',
            'Â'=>'Â',
            'Ã'=>'Ã',
            'Ä'=>'Ä',
            'Ã…'=>'Å',
            'Ç'=>'Ç',
            'È'=>'È',
            'É'=>'É',
            'Ê'=>'Ê',
            'Ë'=>'Ë',
            'ÃŒ'=>'Ì',
            'Í'=>'Í',
            'ÃŽ'=>'Î',
            'Ï'=>'Ï',
            'Ñ'=>'Ñ',
            'Ã’'=>'Ò',
            'Ó'=>'Ó',
            'Ô'=>'Ô',
            'Õ'=>'Õ',
            'Ø'=>'Ø',
            'Ã¥'=>'å',
            'æ'=>'æ',
            'ç'=>'ç',
            'ì'=>'ì',
            'í'=>'í',
            'î'=>'î',
            'ï'=>'ï',
            'ð'=>'ð',
            'ñ'=>'ñ',
            'õ'=>'õ',
            'ø'=>'ø',
            'ý'=>'ý',
            'ÿ'=>'ÿ',
            '€'=>'€'
        );
    }

kommt bei der Ausgabe nur auf i=34, obwohl es 57 Sonderzeichen von der Methode getUmlauteArray() zurückgegeben werden.
Ausgabe:

Das Umlaute Array hat 35 Werte
0) ü <=> &amp;uuml;' <=> ü
 1) ä <=> &amp;auml;' <=> ä
 2) ö <=> &amp;ouml;' <=> ö
 3) Ã? <=> &amp;Oslash;' <=> Ø
 4) Ã <=> &amp;agrave;' <=> à
 5) á <=> &amp;aacute;' <=> á
 6) â <=> &amp;acirc;' <=> â
 7) ã <=> &amp;atilde;' <=> ã
 8) ù <=> &amp;ugrave;' <=> ù
 9) ú <=> &amp;uacute;' <=> ú
 10) û <=> &amp;ucirc;' <=> û
 11) ò <=> &amp;ograve;' <=> ò
 12) ó <=> &amp;oacute;' <=> ó
 13) ô <=> &amp;ocirc;' <=> ô
 14) è <=> &amp;egrave;' <=> è
 15) é <=> &amp;eacute;' <=> é
 16) ê <=> &amp;ecirc;' <=> ê
 17) ë <=> &amp;euml;' <=> ë
 18) Á <=> &amp;Aacute;' <=> Á
 19) Í <=> &amp;Iacute;' <=> Í
 20) Ï <=> &amp;Iuml;' <=> Ï
 21) Ã¥ <=> &amp;aring;' <=> å
 22) æ <=> &amp;aelig;' <=> æ
 23) ç <=> &amp;ccedil;' <=> ç
 24) ì <=> &amp;igrave;' <=> ì
 25) í <=> &amp;iacute;' <=> í
 26) î <=> &amp;icirc;' <=> î
 27) ï <=> &amp;iuml;' <=> ï
 28) ð <=> &amp;eth;' <=> ð
 29) ñ <=> &amp;ntilde;' <=> ñ
 30) õ <=> &amp;otilde;' <=> õ
 31) ø <=> &amp;oslash;' <=> ø
 32) ý <=> &amp;yacute;' <=> ý
 33) ÿ <=> &amp;yuml;' <=> ÿ
 34) â?¬ <=> ?' <=> ?

Update 1:

Der gute Kommentar von Chris (vielen Dank), hat mich auf die Idee gebracht zu schauen, welche Werte als Array Key zugelassen sind (php.net):

The key can either be an integer or a string. The value can be of any type.

Also bei String nachgeschaut… und nichts gefunden…

Ich verwende PHP 5.2.8 und mein Projekt ist iso-codiert.

Ich habe zur Hilfe mal die markiert, die nicht ungezeigt werden. Dabei fällt auf, dass nur Großbuchstaben Array-Values betroffen sind.

return array(
 'ü'=>'ü',
 'ä'=>'ä',
 'ö'=>'ö',
 'Ö'=>'Ö',missing
 'ß'=>'ß',
 'Ã '=>'à',
 'á'=>'á',
 'â'=>'â',
 'ã'=>'ã',
 'ù'=>'ù',
 'ú'=>'ú',
 'û'=>'û',
 'Ù'=>'Ù',missing
 'Ú'=>'Ú',missing
 'Û'=>'Û',missing
 'Ãœ'=>'Ü',missing
 'ò'=>'ò',
 'ó'=>'ó',
 'ô'=>'ô',
 'è'=>'è',
 'é'=>'é',
 'ê'=>'ê',
 'ë'=>'ë',
 'À'=>'À',missing
 'Á'=>'Á',
 'Â'=>'Â',missing
 'Ã'=>'Ã',missing
 'Ä'=>'Ä',missing
 'Ã…'=>'Å',missing
 'Ç'=>'Ç',missing
 'È'=>'È',missing
 'É'=>'É',missing
 'Ê'=>'Ê',missing
 'Ë'=>'Ë',missing
 'ÃŒ'=>'Ì',missing
 'Í'=>'Í',
 'ÃŽ'=>'Î',missing
 'Ï'=>'Ï',
 'Ñ'=>'Ñ',missing
 'Ã’'=>'Ò',missing
 'Ó'=>'Ó',missing
 'Ô'=>'Ô',missing
 'Õ'=>'Õ',missing
 'Ø'=>'Ø',missing
 'Ã¥'=>'å',
 'æ'=>'æ',
 'ç'=>'ç',
 'ì'=>'ì',
 'í'=>'í',
 'î'=>'î',
 'ï'=>'ï',
 'ð'=>'ð',
 'ñ'=>'ñ',
 'õ'=>'õ',
 'ø'=>'ø',
 'ý'=>'ý',
 'ÿ'=>'ÿ',
 '€'=>'€'
 );

 UPDATE 2:LÖSUNG

Mein Datei war ISO codiert und hat deswegen die fehlenden Umlaute als “Ã?” dargestellt. Das Script funktioniert also nur mit einer UTF8 Codierung.

 

Hinterlasse eine Antwort

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  1. Also vielleicht steh ich ja grad komplett aufm Schlauch, aber ich tippe auf irgendwas mit case insensitive, da zB “ö” rauskommt aber kein “Ö”. Ich würde die Frage einfach mal auf Stackoverflow.com stellen, 10min später hast du eine perfekte Antwort ;)