Candid Dauth: UTF-8 in ISO-8859-1 plus numerische Zeichenreferenzen wandeln

Beitrag lesen

Heißa, Christian,

Die Funktion wandelt alles, was nicht us-ascii ist, um in &#<nr>; -- die
ISO-8859-1-Unterstuetzung musst du selber bauen.

Ungefähr so hatte ich das damals auch gemacht, jedoch ist es sehr rechenaufwändig, jedes Zeichen einzeln zu überprüfen. Bei großen Dateien dauerte die Berechnung auf unserem 133-MHz-Server teilweise zwei Minuten. Also beschloss ich, das Ganze etwas einfacher zu lösen, und löste die Hex-Werte auf, multiplizierte aus und kam irgendwann auf den folgenden Code aus regulären Ausdrücken, wobei die großen Seiten nur noch zwei Sekunden zu berechnen brauchten.

function utf8_htmlentities($string, $mkentities=false, $hex=true)  
{  
  if($hex)  
    $rep = array("'&#x'.dechex(", ").';'");  
  else  
    $rep = array("'&#'.(", ").';'");  
  
  if($mkentities) /* Auch ASCII-Zeichen durch HTML-Entities maskieren */  
    $string = preg_replace("/[\\x0-\\x80]/e", $rep[0]."ord('$0')".$rep[1], $string);  
  
  $string = preg_replace("/([\\xc0-\\xdf])([\\x80-\\xbf])/e", $rep[0]."64*ord('$1')+ord('$2')-12416".$rep[1], $string);  
  $string = preg_replace("/([\\xe0-\\xef])([\\x80-\\xbf])([\\x80-\\xbf])/e", $rep[0]."4096*ord('$1')+64*ord('$2')+ord('$3')-925824".$rep[1], $string);  
  $string = preg_replace("/([\\xf0-\\xf7])([\\x80-\\xbf])([\\x80-\\xbf])([\\x80-\\xbf])/e", $rep[0]."262144*ord('$1')+2048*ord('$2')+64*ord('$3')+ord('$4')-63185024)".$rep[1], $string);

return $string;
}

Leider ist der Code schwer nachvollziehbar -- ich schaffe es selbst nicht...

Caramba!
Grüße aus Biberach Riss,
Candid Dauth (ehemals Dogfish)

--
„Jemanden zu lieben bedeutet, ihn nicht zu erdrücken, auch wenn man es gerne wollte – aus Liebe.“ | Mein SelfCode
http://cdauth.net.tc/