utf8.decoder în Dart

Convertoarele din spatele lui utf8: decoder transformă fluxuri de octeți în text, encoder face invers.

Sintaxă
Utf8Decoder get decoder
Utf8Encoder get encoder

Ce face utf8.decoder

utf8.decoder (un Utf8Decoder) și utf8.encoder (un Utf8Encoder) sunt convertoarele folosite de utf8.decode și utf8.encode. Diferența importantă: un convertor se poate aplica pe un flux (Stream) cu stream.transform(utf8.decoder).

Când citești un fișier mare cu File.openRead() sau răspunsul unui server, primești octeții în bucăți. Un caracter cu diacritice poate fi tăiat între două bucăți; utf8.decoder ține minte octeții rămași și îl lipește corect. Combinat cu LineSplitter, obții fluxul de rânduri.

Ce returnează

Convertorul corespunzător.

Exemple

Exemplul 1: Un flux de octeți tăiat în bucăți

Litera ș are doi octeți și este împărțită între două bucăți; decodorul o reface.

import 'dart:convert';

Future<void> main() async {
  final octeti = utf8.encode('Iași');
  final bucati = Stream<List<int>>.fromIterable([octeti.sublist(0, 3), octeti.sublist(3)]);
  print('Bucăți: ${octeti.sublist(0, 3)} și ${octeti.sublist(3)}');
  final text = await bucati.transform(utf8.decoder).join();
  print(text);
}

Rezultat

Bucăți: [73, 97, 200] și [153, 105]
Iași

Exemplul 2: Rânduri dintr-un flux, apoi codificare înapoi

import 'dart:convert';

Future<void> main() async {
  final flux = Stream<List<int>>.fromIterable([utf8.encode('Ana\nMih'), utf8.encode('ai\nIoana\n')]);
  await for (final rand in flux.transform(utf8.decoder).transform(const LineSplitter())) {
    print('Rând: $rand');
  }
  print(utf8.encoder.convert('ț'));
}

Rezultat

Rând: Ana
Rând: Mihai
Rând: Ioana
[200, 155]

Greșeli frecvente

  • Decodezi fiecare bucată separat cu utf8.decode. Dacă o bucată se termină la mijlocul unui caracter, primești FormatException. Folosește transform(utf8.decoder).

Comenzi înrudite

  • utf8: Codec-ul UTF-8: encode transformă textul în octeți, decode transformă octeții înapoi în text.
  • LineSplitter: Împarte un text în rânduri, recunoscând \n, \r\n și \r; funcționează și pe fluxuri cu transform.
  • File.openRead: Deschide fișierul ca flux de octeți citit pe bucăți; potrivit pentru fișiere mari, rând cu rând.