String.prototype.isWellFormed / toWellFormed în JavaScript

Verifică dacă un text are perechi surogat rupte și le înlocuiește cu caracterul �.

Sintaxă
sir.isWellFormed()
sir.toWellFormed()

Ce face String.prototype.isWellFormed / toWellFormed

Textele JavaScript sunt formate din unități UTF-16. Emoji-urile și alte caractere rare ocupă două unități (o pereche surogat). Dacă tai textul la jumătatea unei perechi, rămâne o jumătate „orfană”, iar textul nu mai este Unicode valid.

isWellFormed returnează false dacă textul are astfel de jumătăți. toWellFormed returnează o copie în care ele sunt înlocuite cu caracterul de înlocuire U+FFFD (�). Este util înainte de encodeURIComponent, care aruncă URIError pe texte invalide.

Ce returnează

isWellFormed: true sau false. toWellFormed: un șir nou.

Exemple

Exemplul 1: Un emoji tăiat la jumătate

const mesaj = "Salut 👋";
const taiat = mesaj.slice(0, -1);

console.log(mesaj.isWellFormed());
console.log(taiat.isWellFormed());
console.log(taiat.toWellFormed());

Rezultat

true
false
Salut �

Exemplul 2: Înainte de encodeURIComponent

const taiat = "Salut 👋".slice(0, -1);

try {
  encodeURIComponent(taiat);
} catch (eroare) {
  console.log(eroare.name);
}
console.log(encodeURIComponent(taiat.toWellFormed()));

Rezultat

URIError
Salut%20%EF%BF%BD

Greșeli frecvente

  • Tai textele cu slice la un număr fix de unități (de exemplu pentru un rezumat) fără să verifici emoji-urile. Taie după caractere complete: [...text].slice(0, 50).join("").

Comenzi înrudite

  • String.prototype.normalize: Aduce textul la o formă Unicode standard; util pentru comparații și eliminarea diacriticelor.
  • encodeURIComponent / decodeURIComponent: Codifică un text ca să poată fi pus sigur într-o adresă URL (spații, diacritice, &, =) și îl decodifică.
  • slice: Extrage o bucată dintr-un text sau dintr-un tablou, fără să modifice originalul.