phpbar.de logo

Mailinglisten-Archive

[php] binaerer Unicode in Entities konvertieren

[php] binaerer Unicode in Entities konvertieren

Thomas Richter php at wwedit.org
Die Mar 23 19:11:09 CET 2004


>Aus einer Datei werden jeweils UTF-8 codierte DoppelBytes
>

nicht ganz richtig... UTF-8 definiert eine variable laenge
von zeichen. d.h.

zeichen mit dem wert 0-0x7f werden mit einem byte kodiert...
dieses 1 byte kann man einfach als entity darstellen (soweit
ich weiss ist ja ein entity ein &# plus den zahlenwert plus ; ?)

alle zeichen mit wert > 0x7f werden als mehre bytes kodiert...
(nicht zwingend 2! - bis max. 6 bytes)

als kleine uebersicht sieht das ungefaehr so aus...

U-00000000 - U-0000007F:     0xxxxxxx
U-00000080 - U-000007FF:     110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF:     1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF:     11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF:     111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF:     1111110x 10xxxxxx 10xxxxxx 10xxxxxx
10xxxxxx 10xxxxxx

als am besten mit hilfe von bitmasken die bit-prefixe scannen
und so die anzahl der bytes ermitteln, die das zeichen kodieren.

anschliessen von den entsprechenden bytes die prefixe ausmaskieren
und dann zusammenwuerfeln.

der gefundene wert sollte dann dem entsprechenden zahlenwert entsprechen...

z.bsp:

orginal: 208 173
als bin: 1101 0000 1010 1101

wir erkennen: diese beiden bytes kodieren schon
vollstaendig das zeichen...

ausmaskieren der prefixe:

0001 0000  und  0010 1101

und nun noch so zusammenwuerfen, dass die obersten beiden bits aus
dem zweiten byte verschwinden:

$lowbyte = 45;
$highbyte = 16;
// 6 bits nach links verschieben & die
// freigewordenen bits mit den zweiten byte
// besetzen
$word = ($highbyte << 6) | $lowbyte;

und raus kommt....

0000 0100 0010 1101 = 1069

hoffe das war hilfreich... (google hilft)

thomas richter


php::bar PHP Wiki   -   Listenarchive