Achtergrond:
Codering (encoding) en decodering (decoding) van gegevens werden relevant met de noodzaak om informatie uit te wisselen tussen apparaten, programma's en platforms die symbolen en hun representatie in het geheugen op verschillende manieren kunnen interpreteren. In Python is deze taak urgent geworden vanwege de strikte scheiding tussen strings (str) en bytes (bytes), te beginnen met Python 3.x, waar strings sequenties van Unicode-symbolen zijn en bytes sequenties van bytes.
Probleem:
Bij het werken met bestanden, netwerken en externe systemen moet vaak data worden omgezet tussen byte-representaties en strings. Onjuist gebruik van coderingen kan leiden tot fouten zoals UnicodeEncodeError en UnicodeDecodeError, datacorruptie en problemen met de ondersteuning van verschillende talen.
Oplossing:
In Python wordt de .encode()-methode gebruikt om een string naar bytes om te zetten, en voor de omgekeerde transformatie — .decode(). De meest voorkomende codering is "utf-8":
text = "Hallo, wereld!" encoded = text.encode('utf-8') # Coderen van een string naar bytes print(encoded) # b'\xd0\x9f\xd1\x80...' decoded = encoded.decode('utf-8') # Terug omzetten naar een string print(decoded) # 'Hallo, wereld!'
Belangrijke kenmerken:
open(..., encoding='utf-8')).Wat gebeurt er als je een byte-string decodeert met een onjuiste codering?
Bij het proberen om bytes te decoderen met een onjuiste codering, zal er een fout optreden of zal een onjuiste string ontstaan. Bijvoorbeeld:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # Toont abracadabra, niet "Hallo"
Kun je een string en een byte-string direct samenvoegen met +?
Nee. Dit zal een TypeError veroorzaken.
s = "abc" b = b"def" # s + b # TypeError: kan alleen str (niet "bytes") aan str toevoegen
Kan je een tekstbestand schrijven zonder expliciet de codering op te geven?
Ja, maar dit wordt als een slechte praktijk beschouwd, omdat de standaard systeemcodering wordt gebruikt, die afhankelijk is van de besturingssysteeminstellingen, wat leidt tot incompatibiliteit tussen platforms.
Een programmeur schrijft een logbestand in Windows zonder de codering op te geven. De log wordt geopend in Linux of Mac, maar toont abracadabra in plaats van Cyrillisch.
Voordelen:
Nadelen:
Een programmeur geeft altijd encoding='utf-8' op bij het werken met bestanden:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('Het programma is succesvol beëindigd')
Voordelen:
Nadelen: