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.

Input
Caratteri
0
Punti di codice
0
Unità UTF-16
0
Parole
0
Righe
0

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.