Caratteri, code point e byte

Unicode assegna a ogni carattere di ogni scrittura un numero, il code point, scritto come U+ seguito da cifre esadecimali: la A è U+0041, la è accentata U+00E8, l'euro U+20AC, la faccina sorridente U+1F600. Oltre un milione di posizioni, di cui circa 150.000 già usate.

Il code point va poi trasformato in byte. UTF-8, la codifica del web, usa da uno a quattro byte: uno per l'ASCII, due per le lettere accentate, tre per quasi tutto il resto, quattro per emoji e simboli rari. UTF-16, usata da JavaScript, Java e Windows, usa due byte o una coppia di surrogati da quattro.

Per questo la lunghezza di una stringa dipende da che cosa si conta: "😀".length vale 2 in JavaScript, il carattere occupa 4 byte in UTF-8 e all'occhio è uno solo. E una lettera con accento può essere un code point unico o una lettera più un accento combinante: sembrano uguali ma non lo sono.

Errori frequenti

  • Tagliare una stringa UTF-8 a un numero di byte fisso: si rischia di spezzare un carattere a metà.
  • Contare i caratteri con .length in JavaScript: emoji e caratteri fuori dal piano base valgono 2.
  • Confrontare testi senza normalizzarli: é precomposta ed e più accento combinante sono diverse per il computer.

Domande frequenti

Che differenza c'è fra Unicode e UTF-8?

Unicode è l'elenco dei caratteri con il loro numero; UTF-8 è uno dei modi di scrivere quei numeri in byte. Lo stesso testo Unicode può essere salvato in UTF-8, UTF-16 o UTF-32.

Perché vedo caratteri strani come è al posto di è?

Perché un testo in UTF-8 viene letto come Latin-1: i due byte di è, C3 A8, diventano due caratteri separati. Basta dichiarare la codifica giusta.

Come scrivo un carattere Unicode in HTML?

Con un'entità numerica: é in decimale o é in esadecimale. Se la pagina è in UTF-8, puoi anche scrivere il carattere direttamente.

Come funziona questo calcolo

UTF-8: fino a U+007F un byte 0xxxxxxx; fino a U+07FF due byte 110xxxxx 10xxxxxx; fino a U+FFFF tre byte 1110xxxx 10xxxxxx 10xxxxxx; oltre, quattro byte 11110xxx e tre di continuazione. UTF-16: fino a U+FFFF un'unità da 16 bit; oltre, si sottrae 0x10000 e i 20 bit si dividono in due surrogati, 0xD800 + i 10 bit alti e 0xDC00 + i 10 bassi.