Kategorien
PHP

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.