phpbar.de logo

Mailinglisten-Archive

loesung: Re: [php] binaerer Unicode in Entities konvertieren

loesung: Re: [php] binaerer Unicode in Entities konvertieren

Thomas Richter php at wwedit.org
Die Mar 23 21:14:39 CET 2004


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