Mailinglisten-Archive |
hallo norbet und alle interessierten (stillen) mitleser... ;-)
hab doch noch das "kleine" script geschrieben, welches eine UTF8
Datei einliesst und in html-entities umwandelt.
schoene ist natuerlich, dass dem browser kein utf-8 zeichensatz
mitgeteilt werden muss...
hier ist es...
achso.. eine kleine textdatei text.txt mit dem utf-8 daten sollte
im gleichen verzeichnis liegen. das hier ist sehr nuetzlich...:
http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
testausgaben habe ich erst mal auskommentiert. koennen aber das script
etwas verstaendlicher machen... ;-)
<?php
$utf8 = file_get_contents("text.txt");
$entities = '';
// alle bytes durchlaufen
for ($i=0; $i<strlen($utf8); $i++) {
$byte = ord(substr($utf8,$i,1));
/* laenge des bytes bestimmen */
for ($length=6; $length>0; $length--) {
$mask = pow(2,$length)-1;
$mask = $mask << (8-$length);
// echo "Maske: ".decbin($mask)."<br>";
if (($byte & $mask) == $mask) break;
}
/* evetl. fehlende bytes einlesen ($length-1) */
$addbytes = array();
for ($rest=$length-1;$rest>0;$rest--) {
$i++;
$addbytes[] = ord(substr($utf8,$i,1));
}
$visible = $addbytes;
foreach ($visible as $k => $v)
$visible[$k] = decbin($visible[$k]);
// echo "Laenge des UTF-8 Zeichens: $length, Zeichen: ".
// decbin($byte).
// " - ".implode(' - ',$visible)."<br>";
/* nun entfernen wir die prefixe
fuers erste byte sind das $length+1 bits
fuer alle anderen immer 2 bits */
$byte = $byte & (pow(2,(8-$length))-1);
for ($j=0; $j<count($addbytes); $j++)
$addbytes[$j] = $addbytes[$j] & pow(2,6)-1;
$visible = $addbytes;
foreach ($visible as $k => $v)
$visible[$k] = decbin($visible[$k]);
// echo "Entmaskierte Daten: ".decbin($byte)." - ".
// implode(' - ',$visible)."<br>";
/* und nun alle bytes verknuepfen.
dazu gehen wir vom ersten byte aus.
verschieben das um 6bits nach links und machen einer
oder verknuepfung mit dem 2. byte.
mit dem resultat machen wir das gleiche, damit wir das
dritte byte dranhaengen koennen, usw. */
$target = $byte;
for ($j=0; $j<count($addbytes); $j++) {
// echo "ausgangspunkt: ".decbin($target).", ";
$target = $target << 6;
// echo "nach shl 6: ".decbin($target).", ";
$target = $target | $addbytes[$j];
// echo "nach or ".decbin($addbytes[$j]).": ".
// decbin($target)."<br>";
}
$entities .= "&#$target;";
// echo "<br>";
}
echo $entities;
?>
gruesse
thomas
php::bar PHP Wiki - Listenarchive