Ce face str.encode() și bytes.decode()
Calculatorul salvează și trimite octeți, nu litere. encode() transformă un text (str) în bytes după o codificare, implicit UTF-8, în care literele românești ocupă câte 2 octeți. decode() face drumul invers.
Parametrul errors spune ce se întâmplă cu caracterele care nu pot fi codificate sau decodificate: 'strict' (eroare, implicit), 'ignore' (sunt omise), 'replace' (devin ? sau �), 'backslashreplace'.
Parametri
| Parametru | Descriere |
|---|---|
encoding |
Codificarea: 'utf-8', 'latin-1', 'cp1250' (Windows, Europa Centrală; nu are literele ș și ț cu virgulă), 'ascii'… |
errors |
Cum sunt tratate erorile. |
Ce returnează
encode: bytes. decode: str.
Exemple
Exemplul 1: Text, octeți și înapoi
text = "Ștefan cel Mare"
octeti = text.encode("utf-8")
print(octeti)
print(len(text), "caractere,", len(octeti), "octeți")
print(octeti.decode("utf-8"))
Rezultat
b'\xc8\x98tefan cel Mare'
15 caractere, 16 octeți
Ștefan cel Mare
Exemplul 2: Codificări diferite și erori
octeti = "ăîâ".encode("cp1250")
print(octeti, octeti.decode("cp1250"))
try:
"ș".encode("cp1250")
except UnicodeEncodeError as e:
print("cp1250 nu are litera ș cu virgulă:", e.reason)
print("Brașov".encode("ascii", errors="replace"))
try:
"ăîș".encode("utf-8").decode("ascii")
except UnicodeDecodeError as e:
print("Eroare:", e.reason)
print(b"Bra\xc8\x99ov \xff".decode("utf-8", errors="replace"))
Rezultat
b'\xe3\xee\xe2' ăîâ
cp1250 nu are litera ș cu virgulă: character maps to <undefined>
b'Bra?ov'
Eroare: ordinal not in range(128)
Brașov �
Greșeli frecvente
- Decodifici cu altă codificare decât cea folosită la codificare și obții caractere stricate (
È™în loc deș). Folosește aceeași codificare la ambele capete, de preferat UTF-8.
Comenzi înrudite
bytes() și bytearray(): Secvențe de octeți (valori 0-255) pentru date binare: fișiere, rețea, text codificat.str(): Tipul textelor (șiruri de caractere); str() transformă orice valoare în text.open() și with: Deschide un fișier pentru citire sau scriere; cu with, fișierul este închis automat.bytes.hex() și bytes.fromhex(): Transformă octeții în text hexazecimal și invers.