Lunghezza testo
Conta un testo in cinque modi insieme: caratteri a occhio, punti di codice (il len() di Python), unità UTF-16 (il .length di JavaScript), parole e righe.
Perché "quanto è lungo questo testo?" ha più di una risposta
Sembra una domanda banale, ma la lunghezza di un testo dipende del tutto da cosa stai contando. Una persona conta i caratteri che vede. Un database conta lo spazio di archiviazione che un valore occupa. JavaScript conta qualcosa di diverso. Quando questi numeri non coincidono — e spesso non lo fanno con emoji, lettere accentate e scritture non latine — una singola "lunghezza" è fuorviante. Questo strumento mostra cinque misure significative affiancate, così scegli quella che conta nel tuo caso.
Le cinque metriche spiegate
- Caratteri (grafemi): ciò che un essere umano percepisce come un carattere. Un emoji di famiglia come 👨👩👧, o una lettera con un accento combinante, conta come uno: è il conteggio che corrisponde "a occhio".
- Punti di codice (code points): il numero di valori scalari Unicode. Un singolo carattere visibile può essere formato da più punti di codice uniti, quindi questo numero è spesso maggiore di quello dei grafemi.
- Unità UTF-16: il valore che JavaScript riporta dalla proprietà .length di una stringa. I caratteri fuori dal Piano multilingue di base (la maggior parte degli emoji) occupano due unità UTF-16 ciascuno.
- Parole: il numero di token di tipo parola, rilevati in modo compatibile con Unicode invece di dividere ingenuamente sugli spazi.
- Righe: il numero di righe, contando ogni interruzione di riga.
Perché emoji e accenti rompono il conteggio ingenuo
Il testo moderno è costruito con Unicode, che rappresenta molti caratteri visibili come sequenze anziché come unità singole. Un emoji di bandiera è composto da due simboli indicatori regionali. Un emoji di famiglia è composto da più figure unite da caratteri invisibili di "giunzione a larghezza zero". Una é accentata può essere un singolo punto di codice, o una e semplice seguita da un accento combinante. Ognuno sembra un carattere ma può contare come due, tre o più a seconda della metrica. È proprio per questo che contare a mano, o fidarsi di un solo numero, porta a bug.
Quale conteggio dovresti usare?
- Limiti di caratteri che le persone vedono (una bio, un campo in stile tweet, un’anteprima SMS): usa Caratteri (grafemi), perché corrisponde a ciò che conta l’utente.
- Gestione di stringhe in JavaScript, indicizzazione o slicing: usa le unità UTF-16, poiché è su di esse che si basano .length e gli indici di stringa.
- Dimensioni delle colonne di database: verifica se la tua colonna è misurata in caratteri o in byte — molte sono limitate in byte, e i byte UTF-8 differiscono di nuovo da tutti questi conteggi.
- Conteggi di parole o righe per editor e leggibilità: usa le metriche Parole e Righe.
Che cosa chiamano lunghezza Python e JavaScript
Due dei cinque conteggi qui sopra sono quelli per cui la maggior parte delle persone arriva su questa pagina, e appartengono a linguaggi diversi. len() in Python e .length in JavaScript vengono descritti entrambi come la lunghezza di una stringa, e su tutto ciò che va oltre il semplice ASCII rispondono in modo diverso per lo stesso testo nello stesso istante. Nessuno dei due sbaglia: contano unità diverse, e sopra ci sono entrambi i riquadri, così la differenza si legge invece di indovinarla.
- Python: len() restituisce il numero di punti di codice Unicode, perché una stringa in Python 3 è una sequenza di punti di codice. Guarda il riquadro "Punti di codice": è quello il numero che ti darà len().
- JavaScript: .length restituisce il numero di unità di codice UTF-16, perché una stringa JavaScript è tenuta in UTF-16. Guarda il riquadro "Unità UTF-16". Array.from(text).length percorre invece la stringa un punto di codice alla volta, e quindi coincide con Python.
- Nessuno dei due conta ciò che vedi. Il riquadro "Caratteri" è il conteggio dei grafemi, e nessuna lunghezza integrata dei due linguaggi lo produce: a JavaScript serve Intl.Segmenter e a Python un pacchetto di terze parti. Se il limite che stai applicando è un limite che leggerà una persona, quello è il riquadro giusto.
- Parole e Righe non sono di nessuno dei due. Entrambi possono approssimarle spezzando sugli spazi e sulle interruzioni di riga, ed entrambi si discostano dai conteggi mostrati qui, che sono compatibili con Unicode: su testo scritto senza spazi, sulla punteggiatura e su una interruzione di riga che chiude il testo.
L’esempio dietro Carica esempio è il modo più rapido di vedere la differenza. La sua emoji di famiglia è un carattere per chi legge, cinque punti di codice per Python e otto unità UTF-16 per JavaScript: tre di quei cinque punti di codice stanno fuori dal Piano multilingue di base e costano due unità ciascuno, e i due giunti invisibili fra loro una ciascuno. Un campo in cui si possono scrivere venti caratteri ne contiene davvero venti a occhio, mentre un controllo ingenuo scritto in uno dei due linguaggi rifiuta testo che ci sta.
La lunghezza non è la dimensione in byte
Nessuno dei cinque conteggi qui sopra è un conteggio di byte, ed è facile confondere le due cose. Un conteggio è una proprietà del testo in sé; una dimensione in byte è una proprietà del testo una volta scritto in una codifica, così la stessa stringa occupa una dimensione in UTF-8 e un’altra in UTF-16. Ciò che si misura in byte va quindi misurato dopo la codifica, e quale codifica sia stata scelta fa parte della risposta.
- UTF-8 è ciò che usa quasi tutto, ed è a larghezza variabile: una lettera, una cifra o un segno di punteggiatura ASCII occupa un byte, la maggior parte dei caratteri accentati e non latini due o tre, e molte emoji quattro. Cento caratteri sono cento byte solo se sono tutti ASCII: gli stessi cento caratteri in greco, ebraico, arabo o cinese pesano da due a tre volte tanto.
- Python: len() conta punti di codice, quindi codifica prima di misurare. len(text.encode('utf-8')) è il numero di byte UTF-8, e indicare lì un altro codec dà un numero diverso, che è esattamente il punto.
- JavaScript: .length conta unità UTF-16, quindi non è un conteggio di byte nemmeno lui. new TextEncoder().encode(text).length dà il numero di byte UTF-8, nel browser come in Node, e TextEncoder produce soltanto UTF-8, quindi non c’è alcun codec da indicare.
- Controlla in quale unità è scritto il tuo limite prima di contare qualsiasi cosa. Alcuni motori di database dichiarano una colonna in caratteri e altri in byte, il valore di un’intestazione HTTP e la dimensione di un file sono byte, e una regola scritta per le persone è ciò che mostra il riquadro "Caratteri". Tutto ciò che si misura in caratteri è già qui sopra; tutto ciò che si misura in byte richiede una lunghezza dopo la codifica.
Una volta ottenuto il conteggio dei byte, il Convertitore di dimensioni dati è dove proseguire: trasforma un numero grezzo di byte in entrambi i sistemi di unità insieme — quello costruito sulle potenze di mille e quello costruito sulle potenze di due — e mostra come gli strumenti sul tuo computer riportano ciascuno la stessa dimensione. Questa pagina finisce dove comincia la codifica; quello parte da un numero di byte.
Domande frequenti
- Quale conteggio corrisponde alla lunghezza di stringa di JavaScript?
- Il valore delle unità UTF-16 corrisponde alla proprietà .length grezza di JavaScript. Se il tuo codice affetta o indicizza stringhe, è questo il numero che ne governa il comportamento.
- Perché un emoji conta come più caratteri?
- Molti emoji sono composti da più punti di codice Unicode uniti. Come grafema (ciò che vedi) è un carattere, ma i suoi conteggi di punti di codice e UTF-16 sono più alti, ed è per questo che ogni misura è mostrata separatamente.
- Conta gli spazi e i ritorni a capo finali?
- Sì. Ogni carattere che incolli viene contato, inclusi gli spazi iniziali e finali e le interruzioni di riga. Se i totali sembrano più alti del previsto, controlla la presenza di spazi finali invisibili.
- Il mio testo viene inviato a un server?
- No. Tutto il conteggio avviene nel tuo browser. Il testo che digiti o incolli non lascia mai il tuo dispositivo.
- Cos’è un grafema?
- Un grafema, o "cluster di grafemi", è un carattere così come lo percepisce l’utente: la più piccola unità che un lettore chiamerebbe un singolo carattere, anche se formata da più punti di codice.
- In cosa differiscono i byte da questi conteggi?
- I byte dipendono dalla codifica. In UTF-8, una lettera ASCII è un byte, la maggior parte dei caratteri accentati e non latini sono due o tre, e molti emoji sono quattro. Nessuna delle cinque metriche qui è un conteggio di byte, quindi per i campi limitati in byte codifica prima in UTF-8.
Strumenti correlati
- Convertitore di dimensioni dati
Nessuno dei conteggi qui è una dimensione in byte: quella esiste solo quando il testo è già codificato. Ottenuto quel numero, quella pagina lo legge in unità decimali e binarie insieme e dice come lo chiamerà ogni sistema operativo.
- Tester di regex
Testa espressioni regolari — corrispondenza, sostituzione, divisione.
- Diff di testo
Confronta due testi — ogni riga e parola cambiata.
- Ispettore di caratteri Unicode
Scopri esattamente di quali caratteri è fatto un testo.