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știFormatException. Foloseștetransform(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.