utf8 în Dart

Codec-ul UTF-8: encode transformă textul în octeți, decode transformă octeții înapoi în text.

Sintaxă
import 'dart:convert';

const Utf8Codec utf8
Uint8List encode(String input)
String decode(List<int> codeUnits, {bool? allowMalformed})

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.codeUnits ca octeți UTF-8. Aceia sunt unități UTF-16; pentru diacritice valorile diferă (ș este 537, nu doi octeți).
  • Decodezi cu latin1 un fișier UTF-8 și obții IaÈ™i în loc de Iaș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.