base64Url în Dart

Codec Base64 sigur pentru URL-uri: folosește - și _ în loc de + și /, așa că textul poate sta într-o adresă web.

Sintaxă
import 'dart:convert';

const Base64Codec base64Url
String encode(List<int> bytes)
Uint8List decode(String encoded)
String normalize(String source)

Ce face base64Url

base64Url este un Base64Codec care folosește alfabetul „URL-safe”: caracterele + și /, care au înțeles special în URL-uri și în căile de fișiere, sunt înlocuite cu - și _. Este folosit în token-uri JWT, linkuri de confirmare și nume de fișiere generate.

Se folosește cu encode și decode. Și varianta obișnuită există ca obiect: base64 (pe care base64Encode îl apelează). base64Url.decode acceptă ambele alfabete, iar normalize completează caracterele = lipsă și corectează alfabetul.

Ce returnează

encode: textul Base64 URL-safe; decode: octeții.

Exemple

Exemplul 1: Diferența față de Base64 obișnuit

Aceiași octeți: Base64 normal produce + și /, varianta URL produce - și _.

import 'dart:convert';

void main() {
  final octeti = [251, 255, 191, 62, 63];
  print(base64.encode(octeti));
  print(base64Url.encode(octeti));
  print(base64Url.decode('-_-_Pj8='));
}

Rezultat

+/+/Pj8=
-_-_Pj8=
[251, 255, 191, 62, 63]

Exemplul 2: Link de confirmare cu date în URL

Unele sisteme taie = de la final; normalize îl pune la loc înainte de decodare.

import 'dart:convert';

void main() {
  final cod = base64Url.encode(utf8.encode('ana@exemplu.ro|2026-10-19'));
  final link = 'https://exemplu.ro/confirma?cod=$cod';
  print(link);

  final primit = Uri.parse(link).queryParameters['cod']!.replaceAll('=', '');
  print(primit);
  print(utf8.decode(base64Url.decode(base64Url.normalize(primit))));
}

Rezultat

https://exemplu.ro/confirma?cod=YW5hQGV4ZW1wbHUucm98MjAyNi0xMC0xOQ==
YW5hQGV4ZW1wbHUucm98MjAyNi0xMC0xOQ
ana@exemplu.ro|2026-10-19

Greșeli frecvente

  • Pui Base64 obișnuit într-un URL fără să-l codifici: + devine spațiu la citire și datele se strică. Folosește base64Url.
  • Decodezi un text din care s-a tăiat = de la final: decode aruncă FormatException. Trece-l mai întâi prin base64Url.normalize.

Comenzi înrudite

  • base64Encode: base64Encode transformă octeți în text Base64; base64Decode face invers, din text Base64 în octeți.
  • utf8: Codec-ul UTF-8: encode transformă textul în octeți, decode transformă octeții înapoi în text.
  • Codec: Clasa de bază pentru perechi encode/decode (utf8, base64, json); fuse le leagă în lanț, inverted le inversează.