Calcolatore della lunghezza della stringa

Incolla una stringa e lo strumento riporta la sua lunghezza in quattro sensi diversi, stile JavaScript .length (unità di codice UTF-16), punti di codice Unicode, cluster di grafemi (ciò che gli utenti percepiscono come un carattere) e byte UTF-8 (ciò che la tua colonna di database memorizza effettivamente). Questi numeri non concordano per qualsiasi stringa con emoji, bandiere o segni di combinazione, e quella discordanza è la fonte di molti bug.

I quattro sensi della lunghezza della stringa

  1. 1

    Unità di codice UTF-16

    Ciò che `str.length` restituisce in JavaScript. 1 per la maggior parte dei caratteri, 2 per qualsiasi punto di codice oltre U+FFFF (emoji, scritture antiche).

  2. 2

    Punti di codice

    Uno per scalare Unicode. Le emoji sono 1 ciascuna; le sequenze ZWJ sono multiple.

  3. 3

    Cluster di grafemi

    Ciò che un utente chiama "un carattere". `🇺🇸` è 2 punti di codice ma 1 grafema. `n̈` è 2 punti di codice ma 1 grafema.

  4. 4

    Byte UTF-8

    Ciò che il tuo DB memorizza. ASCII = 1 byte ciascuno; comune europeo = 2; CJK = 3; la maggior parte delle emoji = 4.

Esempi

Stringa JS .length Punti di codice Grafemi Byte UTF-8
hello 5 5 5 5
café 4 4 4 5
😀 2 1 1 4
🇺🇸 4 2 1 8
👨‍👩‍👧 (famiglia) 8 5 1 18
n̈ (n + dieresi) 2 2 1 3

Perché i numeri differiscono

Le stringhe JavaScript sono UTF-16, quindi un punto di codice sopra U+FFFF è memorizzato come una coppia surrogata, due unità di codice UTF-16. "😀".length === 2. Gli utenti odiano questo perché pensano a 😀 come a un carattere.

I grafemi vanno oltre: una bandiera nazionale è due punti di codice di indicatore regionale che l’utente vede come una bandiera. "🇺🇸".length === 4 in JavaScript, il che sembra assurdo, ma è così. Per iterare sui grafemi, usa Intl.Segmenter (moderno), la libreria grapheme-splitter, o gestisci manualmente.

Byte UTF-8: ciò che il tuo database memorizza

Per una colonna di tipo VARCHAR(255):

  • In MySQL utf8 (reale: utf8mb3), i 255 sono byte. café richiede 5 byte, quindi puoi inserire 51 copie.
  • In MySQL utf8mb4 (vero UTF-8, include emoji), sono ancora byte ma la codifica supporta sequenze di 4 byte.
  • In Postgres VARCHAR(255), i 255 sono caratteri (punti di codice), non byte.
  • In SQL Server VARCHAR, varia in base alla collation; NVARCHAR conta unità UCS-2 di 2 byte.

Se dimensioni i campi del database in base al limite di caratteri visibili dall’utente, usa byte × 4 per sicurezza nelle colonne UTF-8, ogni grafema può potenzialmente occupare fino a 4 byte per punto di codice, con sequenze ZWJ che aggiungono di più.

Conteggio dei caratteri in stile Twitter

Twitter conta un tweet secondo una regola personalizzata: punti di codice, ma emoji e ideogrammi CJK contano come 2. Un tweet 100% ASCII può avere 280 caratteri; un tweet con 140 emoji raggiunge il massimo di 140 “caratteri”.

Conteggio SMS: 160 caratteri in GSM a 7 bit. Qualsiasi carattere non GSM (á, é, ñ, emoji) cambia la codifica in UCS-2, e la lunghezza del tuo messaggio scende a 70 caratteri.

Usi pratici

  • Dimensionamento delle colonne del database, controlla il conteggio dei byte prima di scrivere una migrazione.
  • Applicazione dei limiti API, la maggior parte delle API conta i byte, non i caratteri.
  • Validazione dei moduli, mostra all’utente un conteggio dei caratteri accurato che corrisponde alle loro aspettative (grafemi).
  • Debugging delle prestazioni, perché questa regex itera lentamente? Perché l’input è 3 volte più lungo in unità di codice che in grafemi.

Domande frequenti

Quell’emoji è una sequenza ZWJ che combina più punti di codice (ad esempio, un’emoji di famiglia è 7 punti di codice). Twitter la conta come 2 caratteri secondo la regola del peso Unicode; il tuo editor mostra 1 grafema. Entrambi sono tecnicamente corretti, misurano solo cose diverse.

Nei database UTF-8, consenti 4 byte per carattere previsto per sicurezza. Un campo di 100 caratteri (grafemi) dovrebbe essere VARCHAR(400) byte, o se il tuo DB conta in caratteri come Postgres, VARCHAR(100) con la gestione del charset.

In JavaScript: dipende dalla forma di composizione. Composto NFC (U+00E1) ha lunghezza 1; decomposto NFD (U+0061 + U+0301) ha lunghezza 2. Stesso carattere visibile, sequenze di byte diverse.

Le emoji di famiglia e professione sono lunghe sequenze ZWJ. I font senza supporto completo rendono ogni punto di codice come un glifo separato, quindi 👨‍💻 diventa 👨+💻. Aggiornare il font del sistema operativo lo risolve.

Strumenti correlati

Strumento disponibile in altre lingue