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
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
Punti di codice
Uno per scalare Unicode. Le emoji sono 1 ciascuna; le sequenze ZWJ sono multiple.
-
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
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;NVARCHARconta 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
Simbolo Minore o Uguale
Copia il simbolo ≤ e i simboli di confronto matematico correlati. Include Unicode, entità HTML e markup LaTeX per fogli di calcolo, articoli e pagine web.
Generatore di Font per Instagram
Genera "font" Unicode (grassetto, corsivo, script, monospace, fraktur) da incollare direttamente nella tua bio, nel nome, nelle didascalie e nei commenti su Instagram.
Generatore di Font di Facebook
Trasforma il testo in lettere Unicode in grassetto, corsivo, script e altri stili da copiare in post e commenti di Facebook, nella tua bio e su Messenger.
Codificatore di entità HTML
Trasforma cinque caratteri sensibili in entità fisse oppure leggi entità HTML come testo localmente nel browser.
Traduttore di emoji
Scrivi un testo in inglese e ogni parola dell'elenco integrato riceve un'emoji. Copia il risultato come testo con emoji incorporate.
Validatore di DNI e NIE spagnoli
Controlla nel browser formato e lettera di controllo di un DNI o NIE esistente. Non interroga identità, documenti o registri pubblici.
Strumento disponibile in altre lingue
- 文字列長計算ツール [JA]
- Stränglängdsberäknare [SV]
- Stringlengteberekenaar [NL]
- مقياس طول السلسلة النصية [AR]
- Calculateur de longueur de chaîne [FR]
- Calculadora de Comprimento de String [PT]
- 문자열 길이 계산기 [KO]
- Kalkulator Panjang String [ID]
- Calculadora de Longitud de Cadenas [ES]
- Zeichenlängenrechner [DE]
- Công cụ tính chiều dài chuỗi ký tự [VI]
- เครื่องคำนวณความยาวของสตริง [TH]
- Kalkulator długości ciągu znaków [PL]
- Калькулятор длины строки [RU]
- Dize Uzunluğu Hesaplayıcı [TR]
- 字符串长度计算器 [ZH]
- String Length Calculator [EN]