Gerch2003: str_replace mit funktioniert nicht

Hi Leute,

ich habe in einer SQL-Datenbank hintereinander verschiedene Zeichen angegeben.
Leider sind es zum größten Teil Sonderzeichen, welche man auch nicht ändern kann, da die Werte aus der Datenbank von einem externen Programm vorgegeben werden.

Ein Feldeintrag sieht dann z.B. so aus: |}~€‚ƒ„…†‡ˆ‰Š

Jedem dieser Sonderzeichen ist ein bestimmter Wert Zugeordnet, den ich in der Ausgabe wieder "zurückordnen" möchte.

Hier mal mein Versuch:

  
$string = $output['objektgrp'];  
			  
for($x = 0; $x < strlen($string); $x++)	{  
  
$array_1 = array ( 'Â', 'â', '´', 'Æ', 'æ', 'À', 'à', 'ℵ', 'Α', 'α', '&', '∧', '∠', '\'', 'Å', 'å', '≈', 'Ã', 'ã', 'Ä', 'ä', '„', 'Β', 'β', '¦', '•', '∩', 'Ç', 'ç', '¸', '¢', 'Χ', 'χ', 'ˆ', '♣', '≅', '©', '↵', '∪', '¤', '‡', '†', '⇓', '↓', '°', 'Δ', 'δ', '♦', '÷', 'É', 'é', 'Ê', 'ê', 'È', 'è', '∅', ' ', ' ', 'Ε', 'ε', '≡', 'Η', 'η', 'Ð', 'ð', 'Ë', 'ë', '€', '∃', 'ƒ', '∀', '½', '¼', '¾', '⁄', 'Γ', 'γ', '≥', '>', '⇔', '↔', '♥', '…', 'Í', 'í', 'Î', 'î', '¡', 'Ì', 'ì', 'ℑ', '∞', '∫', 'Ι', 'ι', '¿', '∈', 'Ï', 'ï', 'Κ', 'κ', 'Λ', 'λ', '〈', '«', '⇐', '←', '⌈', '“', '≤', '⌊', '∗', '◊', '‹', '‘', '<', '¯', '—', 'µ', '·', '−', 'Μ', 'μ', '∇', ' ', '–', '≠', '∋', '¬', '∉', '⊄', 'Ñ', 'ñ', 'Ν', 'ν', 'Ó', 'ó', 'Ô', 'ô', 'Œ', 'œ', 'Ò', 'ò', '‾', 'Ω', 'ω', 'Ο', 'ο', '⊕', '∨', 'ª', 'º', 'Ø', 'ø', 'Õ', 'õ', '⊗', 'Ö', 'ö', '¶', '∂', '‰', '⊥', 'Φ', 'φ', 'Π', 'π', 'ϖ', '±', '£', '″', '′', '∏', '∝', 'Ψ', 'ψ', '"', '√', '〉', '»', '⇒', '→', '⌉', '”', 'ℜ', '®', '⌋', 'Ρ', 'ρ', '›', '’', '‚', 'Š', 'š', '⋅', '§', 'Σ', 'σ', 'ς', '∼', '♠', '⊂', '⊆', '∑', '⊃', '¹', '²', '³', '⊇', 'ß', 'Τ', 'τ', '∴', 'Θ', 'θ', ' ', 'Þ', 'þ', '˜', '×', '™', 'Ú', 'ú', '⇑', '↑', 'Û', 'û', 'Ù', 'ù', '¨', 'ϒ', 'Υ', 'υ', 'Ü', 'ü', '℘', 'Ξ', 'ξ', 'Ý', 'ý', '¥', 'Ÿ', 'ÿ', 'Ζ', 'ζ' );  
  
$array_2 = array ( '&Acirc;', '&acirc;', '&acute;', '&AElig;', '&aelig;', '&Agrave;', '&agrave', '&alefsym;', '&Alpha;', '&alpha;', '&amp;', '&and;', '&ang;', '&apos;', '&Aring;', '&aring;', '&asymp;', '&Atilde;', '&atilde', '&Auml;', '&auml;', '&bdquo;', '&Beta;', '&beta', '&brvbar;', '&bull;', '&cap;', '&Ccedil;', '&ccedil;', '&cedil', '&cent;', '&Chi;', '&chi;', '&circ', '&clubs;', '&cong;', '&copy;', '&crarr;', '&cup;', '&curren;', '&Dagger;', '&dagger;', '&dArr;', '&darr;', '&deg;', '&Delta;', '&delta;', '&diams;', '&divide;', '&Eacute;', '&eacute;', '&Ecirc;', '&ecirc;', '&Egrave;', '&egrave;', '&empty;', '&emsp;', '&ensp;', '&Epsilon;', '&epsilon;', '&equiv;', '&Eta;', '&eta;', '&ETH;', '&eth;', '&Euml;', '&euml;', '&euro;', '&exist;', '&fnof;', '&forall;', '&frac12;', '&frac14;', '&frac34;', '&frasl;', '&Gamma;', '&gamma;', '&ge;', '&gt;', '&hArr;', '&harr;', '&hearts;', '&hellip;', '&Iacute;', '&iacute;', '&Icirc;', '&icirc;', '&iexcl;', '&Igrave;', '&igrave;', '&image;', '&infin;', '&int;', '&Iota;', '&iota;', '&iquest;', '&isin;', '&Iuml;', '&iuml;', '&Kappa;', '&kappa', '&Lambda;', '&lambda;', '&lang;', '&laquo;', '&lArr;', '&larr;', '&lceil;', '&ldquo;', '&le;', '&lfloor;', '&lowast;', '&loz;', '&lsaquo;', '&lsquo;', '&lt;', '&macr;', '&mdash;', '&micro;', '&middot;', '&minus;', '&Mu;', '&mu;', '&nabla;', '&nbsp;', '&ndash;', '&ne;', '&ni;', '&not;', '&notin;', '&nsub;', '&Ntilde;', '&ntilde;', '&Nu;', '&nu;', '&Oacute;', '&oacute;', '&Ocirc;', '&ocirc;', '&OElig;', '&oelig;', '&Ograve;', '&ograve;', '&oline;', '&Omega;', '&omega;', '&Omicron;', '&oplus;', '&or;', '&ordf;', '&ordm;', '&Oslash;', '&oslash;', '&Otilde;', '&otilde;', '&otimes;', '&Ouml;', '&ouml;', '&para;', '&part;', '&permil;', '&perp;', '&Phi;', '&phi;', '&Pi;', '&pi;', '&piv;', '&plusmn;', '&pound;', '&Prime;', '&prime;', '&prod;', '&prop;', '&Psi;', '&psi;', '&quot;', '&radic;', '&rang;', '&raquo;', '&rArr;', '&rarr;', '&rceil;', '&rdquo;', '&real;', '&reg;', '&rfloor;', '&Rho;', '&rho;', '&rsaquo;', '&rsquo;', '&sbquo;', '&Scaron;', '&scaron;', '&sdot;', '&sect;', '&Sigma;', '&sigma;', '&sigmaf;', '&sim;', '&spades;', '&sub;', '&sube;', '&sum', '&sup;', '&sup1;', '&sup2;', '&sup3;', '&supe;', '&szlig;', '&Tau;', '&tau;', '&there4;', '&Theta;', '&theta;', '&thetasym;', '&htinsp;', '&THORN;', '&thorn;', '&tilde;', '&times;', '&trade;', '&Uacute;', '&uacute;', '&uArr;', '&uarr;', '&Ucirc;', '&ucirc;', '&Ugrave;', '&ugrave;', '&uml;', '&upsih;', '&Upsilon;', '&upsilon;', '&Uuml;', '&uuml;', '&weierp;', '&Xi;', '&xi;', '&Yacute;', '&yacute;', '&yen;', '&Yuml;', '&yuml;', '&Zeta;', '&zeta;', );  
  
$text = $string[$x];  
  
for ( $y = 0; $y < count($array_1); $y++ )	{  
	$text = str_replace ( $array_1[$y], $array_2[$y], $text );  
	}	  
echo $text;

So und das Problem ist jetzt, dass keines dieser Zeichen, welche ich oben als Beispiel gegeben hab umgewandelt werden. Sie werden in der Anzeige, wie im Quellcode als Sonderzeichen und nicht als Code dargestellt.
Nicht mal das €-Zeichen wird umgewandelt ..

Ich dachte schon dass es irgendetwas mit dem Array zu tun hat, wenn ich nämlich eine Sonderzeichenkette in der Variable $text angebe, wird diese umgewandelt ..

Grüße

  1. Warum machst du das überhaupt auf diese absurde Art?

    htmlentities() wäre eine Möglichkeit, noch besser ist aber: lass die Zeichen doch einfach wie sie sind, ich sehe keinen vernünftigen Grund, warum man diese maskieren sollte.

    1. Warum machst du das überhaupt auf diese absurde Art?

      htmlentities() wäre eine Möglichkeit, noch besser ist aber: lass die Zeichen doch einfach wie sie sind, ich sehe keinen vernünftigen Grund, warum man diese maskieren sollte.

      Du glaubst garnicht, wie lange ich mit htmlentities() rumprobiert habe, aber es funktioniert nicht (frag mich nicht warum, ich weis es nicht) .. es wandelt mir die Sonderzeichen nicht in Code um.

      Natürlich, ich bräuchte das garnicht, ich könnte meine If-Abfragen, wenn ich den Zeichen wieder die richtigen Werte zuordnen will auch mit Sonderzeichen machen.

      Also z.B.:

        
      if ($html == "ƒ")	{  
        echo("Freizeitanlage");  
        }  
      
      

      Aber auch das funktioniert nicht.

      Btw., ich habe das ganze local mit Xampp auf dem Server laufen, da ich/wir das nur intern im Büro brauchen.

      1. Du glaubst garnicht, wie lange ich mit htmlentities() rumprobiert habe, aber es funktioniert nicht (frag mich nicht warum, ich weis es nicht) .. es wandelt mir die Sonderzeichen nicht in Code um.

        Dann machst du "etwas" falsch - aufgrund deiner Fehlerbeschreibung ist mehr leider nicht drin.

        Natürlich, ich bräuchte das garnicht, ich könnte meine If-Abfragen, wenn ich den Zeichen wieder die richtigen Werte zuordnen will auch mit Sonderzeichen machen.

        Also z.B.:

        if ($html == "ƒ") {
          echo("Freizeitanlage");
          }

        
        >   
        > Aber auch das funktioniert nicht.  
          
        was sagt denn var\_dump($html); dazu?  
          
        
        > Btw., ich habe das ganze local mit Xampp auf dem Server laufen, da ich/wir das nur intern im Büro brauchen.  
          
        Das sollte keine Rolle spielen.
        
        1. Du glaubst garnicht, wie lange ich mit htmlentities() rumprobiert

          Also z.B.:

          if ($html == "ƒ") {
            echo("Freizeitanlage");
            }

          
          > >   
          > > Aber auch das funktioniert nicht.  
          >   
          > was sagt denn var\_dump($html); dazu?  
          >   
          
          var\_dump($html) sagt dazu string(1) "€" mit jeweils dem entsprechenden Sonderzeichen. string(1) steht aber immer da
          
          1. var_dump($html) sagt dazu string(1) "€" mit jeweils dem entsprechenden Sonderzeichen.

            Dann müsste das hier, wider jeglicher Logik, in deinem Fall bool(false) liefern:

            <?php  
            	$html = '€';  
            	var_dump($html == '€');  
            ?>  
            
            

            string(1) steht aber immer da

            Das liegt daran, dass $html offenbar den Datentyp "string" mit der Länge "1" beinhaltet :)

            1. var_dump($html) sagt dazu string(1) "€" mit jeweils dem entsprechenden Sonderzeichen.

              Dann müsste das hier, wider jeglicher Logik, in deinem Fall bool(false) liefern:

              <?php

              $html = '€';
              var_dump($html == '€');
              ?>

                
              Da muss ich dir leider widersprechen .. es liefert bool(true) .. das was allerdings Martin jetzt etwas über dir/uns geschrieben hat halte ich auch durchaus für möglich \*g\* ..  
                
              Meine php-dateien sind mit ISO-8859-1 kodiert .. wenn ich diese allerdings auf UTF-8 ändere, werden mir ja jegliche Sonderzeichen nur noch als ? dargestellt, was irgendwie nicht sin der Sache ist .
              
            2. Hallo,

              var_dump($html) sagt dazu string(1) "€" mit jeweils dem entsprechenden Sonderzeichen.
              Dann müsste das hier, wider jeglicher Logik, in deinem Fall bool(false) liefern:

              <?php

              $html = '€';
              var_dump($html == '€');
              ?>

                
              wie das? Ich fürchte, das solltest du erklären.  
                
              
              > > string(1) steht aber immer da  
                
              Dann kann der String -was immer er sonst enthält- schonmal kein UTF-8-codiertes Euro-Symbol enthalten, denn das wären 3 Bytes, die dann als string(3) angezeigt werden müssten. Der PHP-Quellcode aus dem Eingangsposting ist aber mit hoher Wahrscheinlichkeit UTF-8, da er Zeichen enthält, die in den gängigen 1Byte-Codierungen nicht darstellbar sind.  
              Fazit: Wir haben Stringkonstanten im Script, die in UTF-8 codiert und teilweise 2 bis 3 Bytes belegen, und vergleichen sie mit Eingaben, die in einer 1-Byte-Codierung ankommen. Da kann Gleichheit nur im ASCII-Bereich auftreten.  
                
              
              > Das liegt daran, dass $html offenbar den Datentyp "string" mit der Länge "1" beinhaltet :)  
                
              Ja, zweifellos - aber wie passt dieser Satz in das Bild, das \*du\* meintest?  
                
              Ciao,  
               Martin  
              
              -- 
              [Butterkeksverteiler](http://community.de.selfhtml.org/zitatesammlung/zitat171) zu werden ist vermutlich eine der wenigen beruflichen Perspektiven, die sich noch bieten, wenn man einen an der Waffel hat.  
                (wahsaga)  
              
              
      2. Hallo,

        Du glaubst garnicht, wie lange ich mit htmlentities() rumprobiert habe, aber es funktioniert nicht (frag mich nicht warum, ich weis es nicht) .. es wandelt mir die Sonderzeichen nicht in Code um.

        if ($html == "ƒ") {

        echo("Freizeitanlage");
          }

        
        > Aber auch das funktioniert nicht.  
          
        das riecht ganz stark danach, dass du ein Problem mit den Zeichencodierungen hast. Möglicherweise hast du teilweise UTF-8 und teilweise ISO-8859-1 in einem undurchschaubaren Mix. Das solltest du vielleicht mal untersuchen und ggf. vereinheitlichen. Gut möglich, dass sich dann auch der Rest in Wohlgefallen auflöst. Ich kann's nicht versprechen, aber ich hab das irgendwie im Urin.  
          
        
        > Btw., ich habe das ganze local mit Xampp auf dem Server laufen, da ich/wir das nur intern im Büro brauchen.  
          
        Dagegen ist nichts zu sagen.  
          
        Ciao,  
         Martin  
        
        -- 
        Wer keiner Fliege etwas zuleide tut, darf sich nicht über die Maden im Fleisch wundern.  
        
        
  2. Hi!

    So und das Problem ist jetzt, dass keines dieser Zeichen, welche ich oben als Beispiel gegeben hab umgewandelt werden. Sie werden in der Anzeige, wie im Quellcode als Sonderzeichen und nicht als Code dargestellt.

    Mir scheint, dir fehlt mindestens grundlegendes Wissen zu Zeichenkodierung und geschriebene Sprache. Wenn du das hast, sei bitte präziser beim Beschreiben, was die Ausgaben und so weiter angeht. Schau dir bei Problemen stets an, welche Bytewerte konkret vorliegen. Dazu kannst du bin2hex() verwenden oder url_encode() "missbrauchen".

    Lo!