Opa Horst: pregmatch -> undenliche Prüfung von Variablen (SONDERZEICHEN)

Beitrag lesen

Guten Tag! Opa Horst hat eine Änderung beim Transfer über $_POST entdeckt.
Also hatte ich bislang deutschen Sonderzeichen ß,ö,ä,ü,Ö,Ä,Ü per Post senden lassen und wie folgt umgewandelt:
$neuze =  Array('Ae','Oe;','Ue','ae','oe','ue','ss','_');
$ander =  Array(chr(196),chr(214),chr(220),chr(228),chr(246),chr(252),chr(223),' ');

$help  =  str_replace($ander,$neuze,$_POST[feld]);
Also ASCII -analoge Zeichen eingesetzt.

Das lief bisher gut - bis - es nicht mehr lief!
 Es kam nicht mehr Ä = chr(196) an, sondern deren Umwandlung in UTF-8 Code!!!

Wenn es dem Einen oder Anderen etwas holprig vorkommt, meine Art Befehle zu schreiben, werde ich trotzdem hier meine Routine zur Umwandlung von UTF-8 Code in Dezimalcode veröffentlichen.
Die maximalen 7 Byte werden hier nicht berücksichtigt - nur 4 Byte,
was , so glaube ich den üblichen Codeumfang umfasst.

<?php // Ausgabe der UTF-8 Daten
function utf8_out1($str)  // Beim UTF 8 -Code wird Jedes Zeichen durch 1,2,3 oder theoretisch

{   // bis zu 7 Byte beschrieben
  $k = strlen($str);   // im Startbyte ist die Anzahl der gesetzten führenden Bits
  $i = 0;

$erg = '';     // gleich der Anzahl der benutzten Bytes, es folgt ein 0-Bit

while ($k >= $i)     // in jedem Folgebyte ist das erste Bit gesezt, es folgt ein 0-Bit
    {             // aus den anderen Bits ist der Zeichencode zu erstellen
$dec = ord($str[$i]);    // LESE DAS ERSTE BYTE

$bytes = $dec >> 4;			// Überprüfe die ersten 4 führenden Bits   		  

// Erweiterter Code Latin 1 direkt übernehmen

if(($i==$k-1)|| (ord($str[$i+1])>>7)==0)  
	     {$erg=$erg. chr($dec);$i ++ ;}  
elseif (($bytes < 8))  
	     {$erg=$erg. chr($dec);			// kein Führendes Bit gesetzt =  ASCII - Code  

$i ++ ;}
else   // Diese Routine funktioniert nur mit UTF 8 Code,
  {   // der Zeichen mit maximal 4 Byte beschreibt
switch($bytes)
               {
                  case 15:
                     $bytes = 4;// $bytes = Anzahl der Byte, die den Zeichencode enthalten
     $mask = 7;// $mask  = Maske zum löschen der Steuerbits
                     break 1;
                  case 14:
                     $bytes = 3;
     $mask = 15;
                     break 1;
                  case 13:
                     $bytes = 2;
     $mask = 63;
                     break 1;
                  case 12:
                     $bytes = 2;
     $mask = 63;

}
$out = 0;
$shift= 6; // $shift = verschieben zum Zusammensetzen
if( $i+$bytes > $k) // doch ein Zeichen aus ANSI-Code
  {$erg = $erg.chr($dec);$i ++;}
else
  {
   for ($l = 0; $bytes-1; $l++)
    {if($l>=$bytes) break 1;// falls (weil!) die Schleife nicht anders beendet wird
     $dec =(ord($str[$l+$i])& $mask);// Lösche Beschreibungsbits

	     if ($l >0){$out =$out<<$shift;}  
			// Verschieben der bereits gelesenen Bits  

$out+=$dec;// Summiere Ergebniscode
       $mask = 63;
}
$erg=$erg. "&#".$out.";";
$i = $i + $bytes;
}
    }
 }

return rtrim($erg);
}
?>
 Na-Ja Bitmanipulation ist vielleich nicht Jedermanns Sache!
Die anschliessende Bearbeitung erfolgt so:

$neuze =  Array('Ae','Oe;','Ue','ae','oe','ue','ss','_');
$ander =  Array("&#196;","&#214;","&#220;","&#228;","&#246;","&#252;","&#223;"," ");
$oder  =  Array(chr(196),chr(214),chr(220),chr(228),chr(246),chr(252),chr(223),' ');
$name=utf8_out1($name);
$dname=str_replace($ander,$neuze,$name);
$dname=str_replace($oder,$neuze,$dname);

Hoffentlich klappt's Opa Horst