String.codeUnitAt în Dart

Dau codurile numerice ale caracterelor: unități UTF-16 (codeUnitAt, codeUnits) sau puncte Unicode (runes).

Sintaxă
int codeUnitAt(int index)
List<int> get codeUnits
Runes get runes

Ce face String.codeUnitAt

Intern, un String Dart este o listă de unități de cod UTF-16, numere între 0 și 65535. codeUnitAt(i) returnează numărul de la poziția i, iar codeUnits returnează toată lista. Pentru literele obișnuite numărul este codul Unicode: 'A' are 65, 'a' are 97, 'ș' are 537.

Caracterele care nu încap într-o unitate (emoji, unele simboluri) ocupă două unități (o „pereche surogat”). runes rezolvă asta: dă codurile Unicode reale (puncte de cod), câte unul pentru fiecare caracter. '😀'.codeUnits are două numere, '😀'.runes are unul: 128512.

Codurile sunt utile pentru calcule simple: poziția unei litere în alfabet (cod - 97), verificarea dacă un caracter este cifră (48–57) sau cifruri ca cel al lui Cezar. Pentru operația inversă, de la cod la text, vezi String.fromCharCode.

Parametri

Parametru Descriere
index Poziția (de la 0).

Ce returnează

codeUnitAt: un int. codeUnits: un List<int> nemodificabil. runes: un Runes (un Iterable<int>).

Exemple

Exemplul 1: Unități de cod și puncte Unicode

void main() {
  print('A'.codeUnitAt(0));
  print('Ana'.codeUnits);
  print('ș'.codeUnitAt(0));
  print('Iași 😀'.codeUnits);
  print('Iași 😀'.runes.toList());
  print('Iași 😀'.length);
  print('Iași 😀'.runes.length);
}

Rezultat

65
[65, 110, 97]
537
[73, 97, 537, 105, 32, 55357, 56832]
[73, 97, 537, 105, 32, 128512]
7
6

Exemplul 2: Cifrul lui Cezar

Fiecare literă mică este mutată cu 3 poziții în alfabet; restul caracterelor rămân la fel.

String cezar(String text, int pas) {
  var rezultat = text.codeUnits.map((c) {
    if (c >= 97 && c <= 122) {
      return (c - 97 + pas) % 26 + 97;
    }
    return c;
  });
  return String.fromCharCodes(rezultat);
}

void main() {
  var secret = cezar('ne vedem la iasi', 3);
  print(secret);
  print(cezar(secret, 23));
}

Rezultat

qh yhghp od ldvl
ne vedem la iasi

Exemplul 3: Numărarea cifrelor dintr-un text

void main() {
  var text = 'Comanda 2026/145 a costat 89 lei';
  var cifre = 0;
  for (var i = 0; i < text.length; i++) {
    var c = text.codeUnitAt(i);
    if (c >= 48 && c <= 57) cifre++;
  }
  print('Cifre: $cifre');
}

Rezultat

Cifre: 9

Greșeli frecvente

  • Parcurgi codeUnits ca să numeri caracterele unui text cu emoji: le numeri de două ori. Folosește runes.
  • Încerci text.codeUnits.add(65): lista este nemodificabilă și aruncă UnsupportedError.

Comenzi înrudite

  • String.fromCharCode: Construiește un text dintr-un cod de caracter (fromCharCode) sau dintr-o listă de coduri (fromCharCodes).
  • String.length: length dă numărul de unități UTF-16 ale textului; isEmpty și isNotEmpty spun dacă textul este gol.
  • StringBuffer.writeAll: writeAll adaugă toate elementele unei colecții, cu un separator opțional; writeCharCode adaugă un caracter după cod.