Codeer eenvoudige tekst naar echte bytes
Laat encode_text de UTF-8-bytes teruggeven. Geef geen afgedrukte weergave, string of lijst met bytegetallen terug.
Een programma kan een naam als tekst begrijpen, maar een bestand of verbinding bevat uiteindelijk bytes. Beide kanten moeten afspreken hoe die bytes tekst voorstellen. Je maakt die omzetting nu zichtbaar met kleine gegevens die helemaal binnen de oefenomgeving blijven.
Een str bevat Unicode-codepunten. Een byte is een getal van nul tot en met 255; een bytes-waarde is een onveranderlijke reeks van zulke getallen. Het is dus een ander type, ook wanneer de afgedrukte inhoud op gewone tekst lijkt.
Een encoding is een afspraak die tekst in bytes omzet. We kiezen hier UTF-8. Gewone ASCII-letters gebruiken daarin één byte, terwijl veel andere codepunten meerdere bytes nodig hebben.
Dat zegt iets over de gecodeerde gegevens, niet over hoe Python intern iedere string in het geheugen bewaart. Je gebruikt UTF-8 hier als uitwisselformaat. Het aantal codepunten en het aantal bytes hoeven daardoor niet gelijk te zijn.
Met text.encode("utf-8") codeer je tekst naar bytes. Met data.decode("utf-8") decodeer je bytes naar tekst. Je moet bij het teruglezen dezelfde juiste afspraak gebruiken; een andere encoding kan geldige maar verkeerde tekst opleveren.
Voorspel de twee lengtes in het voorbeeld en voer het daarna uit. De teruggelezen tekst moet hetzelfde zijn als de oorspronkelijke tekst.
text = "thee €"
data = text.encode("utf-8")
print(data)
print(len(text), len(data))
print(data[0])
print(data.decode("utf-8"))b'thee \xe2\x82\xac' 6 8 116 thee €
De b vóór de afgedrukte waarde laat zien dat het om bytes gaat. Niet-afdrukbare of niet-ASCII-bytes verschijnen in deze weergave vaak met hexadecimale notatie, zoals \xe2. Dat is een manier om één bytewaarde te schrijven, geen extra tekst die naar de ontvanger moet.
Een bytes-waarde indexeren levert een geheel getal op. Bij een string leverde één index juist een string op. Gebruik het type dus bewust: een zichtbare byteweergave is nog geen gedecodeerde naam.
Niet iedere reeks bytes is geldige UTF-8. Eén ontbrekend of verkeerd bytegetal kan de gekozen afspraak verbreken. Voer deze zelfstandige foutvariant uit en lees waarom Python de gegevens niet als tekst kan teruggeven.
data = b"\xff"
print(data.decode("utf-8"))UnicodeDecodeError
Je ziet UnicodeDecodeError. De decoder heeft geen geldige UTF-8-opbouw gevonden en stopt daarom, in plaats van een naam te raden. De opdrachten behouden dit strikte gedrag bij ongeldige invoer.
Met opties zoals errors="ignore" kun je bytes laten overslaan. Daarmee verander je echter de gegevens: een verdwenen letter kan niet meer worden teruggehaald uit het resultaat. Dat is hier niet toegestaan; geef de echte decodeerfout door.
encode_text moet een echte bytes-waarde teruggeven, geen string die begint met de letter b en geen lijst met bytegetallen. decode_text geeft bij geldige invoer juist een string terug. Ook lege gegevens hebben een geldig resultaat in het bijbehorende type.
De eerste twee stappen controleren coderen met eenvoudige en meerbyte-tekst. Daarna lees je verschillende geldige berichten terug en controleer je ook kapotte UTF-8. Je hoeft de fout nog niet op te vangen; in de volgende module leer je foutafhandeling uitgebreider.
Laat encode_text de UTF-8-bytes teruggeven. Geef geen afgedrukte weergave, string of lijst met bytegetallen terug.
Laat encode_text ook accenten, het euroteken en een emoji volledig volgens UTF-8 coderen.
Laat decode_text de bytes met UTF-8 teruglezen naar een string. Ook lege gegevens moeten correct worden teruggegeven.
Laat decode_text bij ongeldige of onvolledige UTF-8 UnicodeDecodeError doorgeven. Sla geen bytes over en vervang ze niet.
encode en decode moeten de juiste encodingafspraak gebruiken.Hierna herken je een afgesproken tekstvorm met een klein patroon.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.