Conteggio dei byte di una stringa, per codifica

Misura quanti byte occupa la stringa inserita in UTF-8, Shift_JIS, EUC-JP, UTF-16 e JIS (ISO-2022-JP). Utile per verificare i limiti di lunghezza dei campi di una base di dati e i limiti d'immissione dei moduli.

Consigli

  • In UTF-8 le lettere e le cifre latine occupano un byte, mentre gli ideogrammi e i sillabari giapponesi ne occupano nella maggior parte dei casi tre: a parità di caratteri, dunque, un testo in italiano e uno in giapponese hanno lunghezze in byte molto diverse.
  • Nei sistemi datati in cui una colonna della base di dati impone un limite espresso in byte, come VARCHAR(255), un testo che contiene ideogrammi raggiunge il limite assai prima di uno in caratteri latini.
  • Molte faccine sono rappresentate da una coppia surrogata, cioè da due unità di codice, e occupano quattro byte sia in UTF-8 sia in UTF-16: è questa la ragione per cui nei conteggi dei caratteri delle reti sociali si raggiunge il limite prima del previsto.
  • Se conoscete già il numero di byte e volete convertirlo in KB, MB o altre unità, usate lo strumento affine per la conversione delle unità di capacità. Questo si occupa invece del calcolo inverso: dalla stringa al numero di byte.

Domande frequenti

Il numero di caratteri conta quanti segni si vedono, mentre il numero di byte indica quanti byte, cioè quanti ottetti, servono a conservare o trasmettere quella stringa come dato. Per i caratteri ASCII i due valori coincidono, con un byte per carattere; nei testi che contengono caratteri multibyte, come quelli giapponesi, divergono sensibilmente.

UTF-8 codifica ciascun carattere con una lunghezza variabile da uno a quattro byte e per la maggior parte del giapponese — sillabari e ideogrammi d'uso comune — ne impiega tre. Shift_JIS, invece, codifica quasi tutto il giapponese in due byte: a parità di testo, dunque, UTF-8 occupa di norma più byte.

Dipende dal tipo di base di dati e dalla codifica impostata per la colonna. In MySQL, VARCHAR(n) limita in linea di principio a n caratteri, ma internamente esistono anche limiti in byte, per esempio sulla lunghezza delle chiavi utilizzabili negli indici: di qui gli errori che si incontrano con testi contenenti faccine. Per il comportamento effettivo consultate la documentazione del sistema che usate.

Lettere, cifre e segni a mezza larghezza occupano un byte in UTF-8, Shift_JIS ed EUC-JP, mentre i caratteri a larghezza piena — sillabari, ideogrammi e segni — ne occupano da due a tre secondo la codifica. Uno stesso testo di dieci caratteri pesa quindi dieci byte se è tutto a mezza larghezza e da venti a trenta se è tutto a larghezza piena.

Questo strumento calcola, a partire dalla stringa inserita, quanti byte essa occupi in ciascuna codifica. Quello per la conversione delle unità prende invece un numero di byte già noto, per esempio 1.500.000, e lo esprime in KB, MB o GB. Usate il primo per passare dalla stringa ai byte, il secondo per passare dai byte alle altre unità.
Tool-kun

A proposito — il legame poco noto fra i limiti di caratteri delle reti sociali e il numero di byte

Il gruppo di caratteri chiamato «utf8» nelle vecchie versioni di MySQL non era in grado di conservare le faccine di Unicode, cioè i caratteri supplementari a partire da U+10000. UTF-8 è per sua natura una codifica a lunghezza variabile fino a quattro byte, ma l'«utf8» di MySQL, per ragioni storiche, ne trattava al massimo tre: per anni si segnalarono errori nell'inserimento di testi contenenti faccine. Oggi si raccomanda il passaggio a «utf8mb4», che gestisce correttamente i quattro byte: un esempio emblematico di quanto importi comprendere con precisione le specifiche delle codifiche e delle lunghezze in byte.

Quando Twitter, oggi X, imponeva il limite di 140 caratteri, si discusse a lungo di un'iniquità: in 140 caratteri un utente giapponese scriveva un testo ampiamente compiuto, mentre uno di lingua inglese arrivava appena a venti o trenta parole. La ragione sta nel fatto che in inglese una lettera dell'alfabeto vale un carattere, mentre un singolo ideogramma giapponese racchiude molta più informazione. In seguito Twitter introdusse un sistema proprio di ponderazione, contando un carattere per le lingue come il giapponese e in certi casi due byte per un carattere nelle lingue come l'inglese, così da riequilibrare le condizioni.

Una vicenda analoga riguarda i messaggi brevi dei telefoni cellulari. Nel sistema GSM un messaggio arriva di norma a 160 caratteri, ma basta un solo carattere estraneo al gruppo GSM a sette bit — una faccina o un ideogramma — perché la codifica passi a UCS-2, equivalente a UTF-16, e il limite crolli di colpo a settanta caratteri. Il fenomeno per cui «un solo carattere giapponese dimezza abbondantemente il numero di caratteri inviabili» è l'esempio più tipico del rapporto fra codifiche e lunghezza in byte di cui tratta questa pagina.