Hallo Herr Schnoor,

danke für die Zusendung der Datei Codepage-univers.py. 
Diese Datei enthält allerdings keine Berechnung von Bytes, weder eine 
fehlerhafte noch eine korrekte.

Die zuvor übersandte Datei keyboard-coding-asia.py enthält jedoch eine solche 
Berechnung. 
Dort wird die Anzahl der Bytes eines Strings mittels der Funktion unit() 
bestimmt, und zwar so:

def unit(digit):             # --------------------- Analyse der Anzahl <bits> 
---------------------
    # digit = Ordnungszahl ord(ch) eines UTF8-Zeichens ch (Einfügung von mir, 
WB)
    if digit < 256:
        byte = 1
    elif digit > 256 and digit < 65536:
        byte = 2
    elif digit > 65535 and digit <16777215:
        byte = 3
    elif digit > 16777215:
        byte = 4
    return byte

Wie dieser Python-Coder verrät, sind – oder waren – Sie offenbar davon 
überzeugt, dass für die Codierung der Codepoint-Nummer eines UTF8-Zeichens für 
jedes der möglichen 1/2/3/4 Bytes alle 8 Bit eines Bytes zur Verfügung stehen. 
(Für 1 Byte 2**8 = 256 Bit, für 2 Byte 2**16 = 65536 Bit, etc.) 

Dies ist jedoch nicht der Fall. Denn die Bytes enthalten – zusätzlich zur 
Codepoint-Nummer – noch einen Geheimcode (den Sie als Experte für Codierung – 
unbegreiflicherweise – nicht zu kennen scheinen). 
Dieser Geheimcode ist eine Markierung dafür, aus wie vielen Byte ein Zeichen 
besteht. 
Bei einem Ein-Byte-Zeichen beginnt dieses Solo-Byte mit einem 0-Bit. 
Ein Mehr-Byte-Zeichen besteht logischerweise aus einer Gruppe zusammengehöriger 
Bytes, 
einem sogenannten Start-Byte und ein oder mehreren Folge-Bytes: 
Das Start-Byte beginnt mit einer Folge von 1-Bits, deren Anzahl gleich der 
Anzahl der Folge-Bytes entspricht (11, 111, 1111 = 2,3,4 Folge-Bytes). 

In der folgenden Tabelle sind die Intervalle der Ordnungszahlen für 1/2/3/4 
Bytes 
sowie die geheime Bit-Struktur des Codes dargestellt ( vgl. 
https://en.wikipedia.org/wiki/UTF-8#Encoding ):

Code point ↔ UTF-8 conversion
First code point                Last code point         Byte 1          Byte 2  
        Byte 3          Byte 4
U+0000          U+007F          0xxxxxxx
U+0080          U+07FF          110xxxxx        10xxxxxx
U+0800          U+FFFF          1110xxxx        10xxxxxx        10xxxxxx
U+010000                U+10FFFF                11110xxx        10xxxxxx        
10xxxxxx        10xxxxxx

Aufgrund der Ordnung der Intervalle nach Byte-Anzahlen kann man nun aus der 
Ordnungszahl ord(ch) eines UTF8-Zeichens ch leicht seine Byteanzahl berechnen, 
etwa mit folgender Python-Funktion:

def getNumBytes(ch):
    "liefert die Anzahl der Bytes (1 bis 4) des UTF8-Zeichens ch via ord(ch)"
    MaxUTF8 = 1114111
    point = ord(ch)
    if point in range(0, 2**7): return 1
    elif point in range(2**8, 2**11): return 2
    elif point in range(2**11, 2**16): return 3
    elif point in range(2**16, 1 + MaxUTF8): return 4

Dieser Geheimcode ist doch clever gemacht von den Entwicklern der 
UTF8-Codierung der Unicode-Zeichen, oder?

W. Büchel
_______________________________________________
python-de Mailingliste -- python-de@python.org
Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an 
python-de-le...@python.org
https://mail.python.org/mailman3/lists/python-de.python.org/
Mitgliedsadresse: arch...@mail-archive.com

Reply via email to