Ce face utf8
utf8 este o constantă de tip Utf8Codec din dart:convert. UTF-8 este codificarea folosită aproape peste tot: fișiere, pagini web, JSON. În UTF-8, literele englezești ocupă un octet, iar diacriticele românești (ă, ș, ț…) ocupă câte doi.
utf8.encode(text) returnează octeții (Uint8List). utf8.decode(octeti) face invers. Dacă octeții nu sunt UTF-8 valid, decode aruncă FormatException; cu allowMalformed: true, octeții greșiți devin caracterul de înlocuire �.
De aceea text.length (numărul de unități UTF-16) diferă de utf8.encode(text).length (numărul de octeți) când textul are diacritice.
Parametri
| Parametru | Descriere |
|---|---|
input |
La encode: textul. |
codeUnits |
La decode: octeții. |
allowMalformed |
Opțional. true înlocuiește octeții invalizi cu � în loc să arunce eroare. |
Ce returnează
encode: Uint8List cu octeții. decode: String.
Exemple
Exemplul 1: Litere și octeți
import 'dart:convert';
void main() {
const oras = 'Iași';
final octeti = utf8.encode(oras);
print(octeti);
print('Caractere: ${oras.length}, octeți: ${octeti.length}');
print(utf8.decode(octeti));
print(utf8.encode('ș ț ă î â'));
}
Rezultat
[73, 97, 200, 153, 105]
Caractere: 4, octeți: 5
Iași
[200, 153, 32, 200, 155, 32, 196, 131, 32, 195, 174, 32, 195, 162]
Exemplul 2: Octeți invalizi
Octetul 0xFF nu poate apărea în UTF-8.
import 'dart:convert';
void main() {
final stricat = [0x41, 0x6E, 0xFF, 0x61];
try {
utf8.decode(stricat);
} on FormatException catch (eroare) {
print('Eroare: ${eroare.message}');
}
print(utf8.decode(stricat, allowMalformed: true));
}
Rezultat
Eroare: Invalid UTF-8 byte
An�a
Exemplul 3: Mărimea unui mesaj SMS
Limitele de mărime se măsoară de obicei în octeți, nu în caractere.
import 'dart:convert';
void main() {
for (final mesaj in ['Ne vedem la 5', 'Mulțumesc frumos, știți ce oră e?']) {
print('"$mesaj": ${mesaj.length} caractere, ${utf8.encode(mesaj).length} octeți');
}
}
Rezultat
"Ne vedem la 5": 13 caractere, 13 octeți
"Mulțumesc frumos, știți ce oră e?": 33 caractere, 37 octeți
Greșeli frecvente
- Folosești
text.codeUnitsca octeți UTF-8. Aceia sunt unități UTF-16; pentru diacritice valorile diferă (șeste 537, nu doi octeți). - Decodezi cu
latin1un fișier UTF-8 și obțiiIaÈ™iîn loc deIași. Folosește aceeași codificare la scriere și la citire.
Comenzi înrudite
utf8.decoder: Convertoarele din spatele lui utf8: decoder transformă fluxuri de octeți în text, encoder face invers.latin1: Codec-urile Latin-1 (ISO-8859-1, 256 de caractere) și ASCII (128 de caractere), un octet pe caracter.base64Encode: base64Encode transformă octeți în text Base64; base64Decode face invers, din text Base64 în octeți.File.readAsBytes: readAsBytes citește un fișier ca octeți (imagini, arhive, orice fișier binar); writeAsBytes scrie octeți.