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("Ä","Ö","Ü","ä","ö","ü","ß"," ");
$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