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.
Il conteggio dei caratteri e quello dei byte non sono la stessa cosa
Che dieci caratteri occupino trenta byte è cosa di tutti i giorni non appena entra in gioco un testo non latino. Il conteggio dei byte di una stessa stringa cambia con la codifica: in UTF-8 un carattere giapponese occupa tre byte e un'emoji quattro, mentre in Shift_JIS un carattere giapponese sta in due. Questo strumento mostra in un colpo solo a quanti byte ammonti il vostro ingresso sotto cinque schemi per volta, ossia UTF-8, Shift_JIS, EUC-JP, UTF-16 e ISO-2022-JP.
Il conteggio delle unità di codice UTF-16 mostrato accanto è esattamente il valore che .length restituisce in JavaScript. Qui sta l'inciampo più spesso trascurato, perché le emoji e certi caratteri sono rappresentati da una coppia surrogata di due unità, sicché ciò che una persona conta come un carattere, .length lo conta come due. Ecco perché un limite di lunghezza realizzato con .length respinge prima del previsto un ingresso che contenga emoji. Dal lato della banca dati vale lo stesso: se un VARCHAR(255) conti byte o caratteri dipende dal prodotto e dalla sua configurazione, perciò tenere entrambi i numeri sott'occhio vi tiene lontani da un giudizio sbagliato.
Come si usa
- Inserite il vostro testo I conteggi si aggiornano nell'istante in cui incollate. Gli a capo sono del tutto ammessi.
- Confrontate il conteggio dei caratteri con quello dei byte Un solo carattere può comunque ammontare a tre byte in UTF-8.
- Leggete la riga della codifica che vi riguarda Guardate lo schema che il vostro archivio o la vostra destinazione usano davvero.
-
Controllate il conteggio delle unità UTF-16
Se il vostro limite è imposto con
.lengthdi JavaScript, è questo il numero che decide l'esito.
Consigli per sfruttarlo al meglio
- 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.
Quando torna utile
Nell'evitare un traboccamento di colonna
Dove l'archivio è limitato a byte, il testo giapponese entra per appena un terzo di quanto si supporrebbe. Potete accertarlo prima di inserire.
Nel progettare il limite d'ingresso di un modulo
Vi dà il materiale per decidere se porre il tetto in caratteri o in byte.
Nel dialogare con un sistema ereditato
Nei file a lunghezza fissa e negli scambi in Shift_JIS, il conteggio dei byte è la posizione della colonna.
Nel provare come siano trattate le emoji
Potete accertare se una stringa con coppie surrogate venga presa con la lunghezza che intendete.
Termini della codifica dei caratteri
- UTF-8
- Uno schema che rappresenta i caratteri del mondo in uno-quattro byte di lunghezza variabile. Di massima l'ASCII ne prende uno, il giapponese tre e le emoji quattro.
- Shift_JIS
- Uno schema per il giapponese in cui un carattere giapponese sta in due byte. Resta in uso nei sistemi più vecchi e nei file a lunghezza fissa.
- EUC-JP
- Uno schema giapponese a lungo usato sui sistemi UNIX. Un carattere giapponese occupa di norma due byte.
- UTF-16
- Uno schema che rappresenta i caratteri in unità di sedici bit. Le stringhe di JavaScript si contano in queste unità.
- Coppia surrogata
- L'accorgimento per cui un carattere troppo grande per una sola unità UTF-16 viene espresso come coppia di due. Le emoji e certi caratteri ricadono in questa classe.
- ISO-2022-JP
- Uno schema che commuta gli insiemi di caratteri mediante sequenze di escape, a lungo usato nella posta giapponese. È chiamato anche semplicemente JIS.
Domande frequenti
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. Nel novembre 2017 Twitter portò il limite a 280 e introdusse insieme un conteggio ponderato: le lettere latine e la maggior parte degli altri caratteri pesano 1, mentre i caratteri cinesi, giapponesi e coreani (CJK) pesano 2. In inglese si possono così scrivere fino a 280 caratteri, mentre il giapponese resta di fatto a 140, riducendo il divario tra le lingue.
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.