Hallo,
Nachdem ich hier heute schon eine Frage gestellt habe und mir geraten wurde, das ganze anders anzugehen, habe ich ...
... nun ein Doppelposting abgesetzt, in dem ich dasselbe Problem nochmal vortrage. - Warum? War dein erster Thread von heute nachmittag plötzlich nicht mehr gut?
Jetzt bin ich auf neue Probleme gestoßen.
Dafür haben wir immer noch dasselbe: Wir wissen nicht, wozu du solche Klimmzüge machst, und wir wissen nicht, welche Probleme du dabei hast, weil du außer "geht nicht" oder ähnlichen Formulierungen nichts sagst.
Hier mein Quelltext, ich habe ihn auskommentiert.
Nein. Unter "auskommentieren" versteht man, einen Abschnitt des Quelltexts als Kommentar zu setzen, um ihn wirkungslos zu machen, ohne ihn gleich zu löschen.
//Ein einzelnes Zeichen wird eingegeben:
$string = htmlentities($_GET['textfeld'], ENT_QUOTES); //kodiert Umlaute und Sonderzeichen in mehrere gültige Zeichen
Und damit wird dein eingegebenes "ü" schon mal zu "ü", ...
echo $string."<br />\n"; //zeigt die codierten Zeichen (mehrere)
... wovon du dich an dieser Stelle durch einen Blick in den Quellcode überzeugen kannst. Du hast also bereits hier deine Forderung erfüllt, dass der String nur noch aus ASCII-Zeichen bestehen soll. Alles weitere ist eigentlich Unsinn.
for ($i = 0; $i < strlen($string); $i++) { //gibt immer ein Zeichen (der codierten Zeichen) nach dem anderen aus
Der Kommentar ist falsch: Zwar lässt du eine Schleife so oft durchlaufen, wie der String Zeichen hat, aber ...
$x = ord ( $string ); //gibt den ASCII Wert des Zeichens aus
... du betrachtest in jedem der 6 Durchläufe nur das erste Zeichen des Strings.
echo $x."<br />\n";
Die Ausgabe "38" hat mich an der Stelle erst verunsichert, weil es sehr unüblich ist, Zeichencodes in dezimal anzugeben. Ich hatte deine Ausgabe daher erst als 0x38 interpretiert (das wäre die Ziffer 8) und konnte mir keinen Reim drauf machen. In Wirklichkeit ist es ja 0x26, also das &-Zeichen. Völlig korrekt.
if ($x < 64) { //wegen der htmlentities gibt es nur mehr Zeichen mit einem Wert < 128
$z = sprintf ( '%b', $x ); //gibt den ASCII Wert als Binärcode aus
echo '00'.$z."<br />\n"; //fügt vorne zwei Nullen an, um den Binärcode auf 8-bit zu bringen
} else {
$z = sprintf ( '%b', $x );
echo '0'.$z."<br />\n"; //fügt eine Null an, um den Binärcode auf 8-bit zu bringen
}
Warum diese komplizierten Fallunterscheidungen? Gib doch einfach im Formatstring an, dass du die Ausgabe 8stellig mit führenden Nullen haben willst:
$z = sprintf('%08b', $x);
echo chr($x); //zeigt das als Binärcode ausgegebene Zeichen normal an
Das kennst du doch schon. Warum hier nochmal?
Da die Ausgabe von Umlauten als Binärcode mit sprintf nicht funktioniert hat (es sind immer über 8-stellige Zahlen herausgekommen), ...
Hä? Dann hattest du noch andere grobe Fehler drin, die dein gezeigter Code nicht mehr erkennen lässt.
Wenn das ein Umlaut ist, wird es zu einer Zeichenfolge umgewandelt, die einzeln durch die for Schleife läuft. Für jedes dieser Zeichen soll ein 8-stelliger Binärcode ausgegeben werden.
Das geht nicht. Der Vorrat an darstellbaren Zeichen umfasst viele tausend, mit 8bit sind aber nur 256 Zeichen darstellbar. Das erfordert, dass manche Zeichen durch mehr als ein Byte (8bit) repräsentiert werden - entweder, indem man sie mit htmlentities() in Entity-Referenzen oder NCRs umwandelt, oder indem man sie direkt in UTF-8 codiert.
So long,
Martin
--
Husten kann böse Folgen haben.
Besonders im Kleiderschrank.