Convertitore di maiuscole

Converti testo tra camelCase, snake_case, kebab-case, Title Case e altro, con maiuscole in base alla lingua e strumenti per le righe.

Testo

Forme di scrittura

  • UPPERCASE
    XMLHTTPREQUEST HANDLER FOR ISTANBUL CITY GUIDE
  • lowercase
    xmlhttprequest handler for istanbul city guide
  • Title Case
    Xmlhttprequest Handler For Istanbul City Guide
  • Sentence case
    Xmlhttprequest handler for istanbul city guide
  • camelCase
    xmlHttpRequestHandlerForIstanbulCityGuide
  • PascalCase
    XmlHttpRequestHandlerForIstanbulCityGuide
  • snake_case
    xml_http_request_handler_for_istanbul_city_guide
  • kebab-case
    xml-http-request-handler-for-istanbul-city-guide
  • CONSTANT_CASE
    XML_HTTP_REQUEST_HANDLER_FOR_ISTANBUL_CITY_GUIDE
  • dot.case
    xml.http.request.handler.for.istanbul.city.guide

Operazioni sulle righe

Risultato
XMLHttpRequest handler for istanbul city guide

Righe: 1

Una sola divisione in parole, dieci forme di scrittura

Cambiare le maiuscole di un testo sembra la cosa più semplice che un programma possa fare, ed è all'origine di un numero sorprendente di bug reali. In parte perché «maiuscole e minuscole» sono in realtà due problemi distinti sotto un unico nome. Portare un testo in UPPERCASE o in lowercase è una corrispondenza carattere per carattere definita da Unicode. Portarlo in camelCase o in snake_case è tutt'altro: prima bisogna decidere dove sono le parole, e solo dopo ricomporre e unire. Questo strumento fa entrambe le cose, mostra tutti i risultati insieme e, soprattutto, dice quali di quelle risposte dipendono da un'impostazione di lingua.

Le sei forme da programmatore derivano tutte dalla stessa divisione, quindi non possono mai contraddirsi. Questi sono i suoi confini:

  • Una minuscola seguita da una maiuscola inizia una nuova parola, ed è ciò che trasforma fooBar in foo e Bar.
  • Una sequenza di maiuscole finisce dove inizia la parola successiva, cioè all'ultima maiuscola prima di una minuscola. XMLHttpRequest dà XML, Http e Request; IOError dà IO ed Error.
  • Una cifra seguita da una maiuscola inizia una nuova parola, quindi html5Parser dà html5 e Parser.
  • Tutto ciò che non è lettera, cifra o segno combinante separa le parole: spazi, trattini bassi, trattini, punti e segni di punteggiatura.

Per il resto le cifre restano attaccate alla parola che le precede, ed è per questo che utf8 e address2 passano interi. È una divergenza voluta rispetto a lodash, il cui divisore tratta ogni sequenza di cifre come una parola a sé e trasforma utf8 in utf_8: tecnicamente coerente, ma non ciò che intendeva chi ha dato il nome a una variabile.

La divisione è scritta con le proprietà di Unicode e non con una classe di caratteri ASCII, quindi non si limita all'inglese. Un identificatore in cirillico si divide ai suoi confini di maiuscole esattamente come uno latino. Una scrittura che non distingue maiuscole — ebraico, arabo, cinese, giapponese, coreano — non ha confini di quel tipo da trovare, perciò le sue parole si dividono solo sui separatori, e questa è la risposta corretta, non un limite.

Sigle: due risposte giuste

Una volta che XMLHttpRequest è stato diviso in XML, Http e Request, ricomporlo come PascalCase pone una domanda che non ha un'unica risposta corretta. Ricomponendo ogni parola si ottiene XmlHttpRequest, cioè quello che produce lodash e quello che chiede la guida di stile Java di Google: trattare una sigla come una parola comune perché i confini restino visibili in nomi come ParseXmlDocument. Mantenendo la sequenza di maiuscole si ottiene XMLHttpRequest, che è il nome reale dell'API del browser e la convenzione seguita da gran parte del DOM e da molto di ‎.NET.

Entrambe compaiono in basi di codice reali, quindi lo strumento le offre entrambe e per impostazione predefinita ricompone. L'opzione riguarda solo camelCase e PascalCase: le altre forme ricompongono comunque l'intera parola, quindi XMLHttpRequest dà xml_http_request e XML_HTTP_REQUEST in ogni caso.

Un dettaglio è fisso e non si sceglie: la prima parola di un nome in camelCase passa sempre interamente in minuscolo, anche quando è una sigla. Mantenerla darebbe PascalCase, e mantenerla a metà darebbe xMLHttpRequest, una forma che nessuna guida di stile raccomanda e su cui ogni lettore inciampa. Perciò XMLHttpRequest dà xmlHttpRequest in entrambi i casi, mentre parseXMLDocument conserva la sigla al centro quando lo si richiede.

La i turca, e perché la lingua è una scelta

JavaScript ha due metodi per passare alle maiuscole, e la differenza fra loro ha fatto cadere sistemi in produzione. Il metodo toUpperCase applica la corrispondenza Unicode indipendente dalla lingua: la lettera i diventa I. Il metodo toLocaleUpperCase applica le regole di una lingua specifica, e in turco e azero la maiuscola di i è İ, la maiuscola con il punto, perché quegli alfabeti contengono anche una ı senza punto la cui maiuscola è I. Portate alle maiuscole l'input di un utente turco con la sua lingua, confrontatelo con una parola chiave di protocollo e il confronto fallirà su un carattere quasi identico.

È il bug di internazionalizzazione più comune nella gestione delle stringhe, ed è invisibile finché non capita a voi. Per questo lo strumento non indovina mai. Il suo valore predefinito è la corrispondenza indipendente dalla lingua, quella di cui hanno bisogno identificatori, token di protocollo, intestazioni HTTP e chiavi di database. Scegliere una lingua passa alle sue regole, e ogni volta che quella scelta cambia un risultato lo strumento mostra accanto la risposta indipendente dalla lingua, così si vede esattamente che cosa ha fatto la lingua.

'i'.toUpperCase()             // 'I'
'i'.toLocaleUpperCase('tr')   // 'İ'  dotted capital
'I'.toLocaleLowerCase('tr')   // 'ı'  dotless lowercase
'ISTANBUL'.toLocaleLowerCase('tr')  // 'ıstanbul'

Altre tre lingue cambiano la risposta, e lo strumento le offre tutte. Il lituano conserva il punto sulla i quando porta in minuscolo una maiuscola che reca un altro accento, così Ì dà una i seguita da un punto combinante e da un accento grave combinante, e non l'unica ì precomposta. Il greco elimina il tonos nel passaggio alle maiuscole, quindi άνθρωπος dà ΑΝΘΡΩΠΟΣ e non ΆΝΘΡΩΠΟΣ, perché il greco non scrive l'accento sulle maiuscole. L'azero condivide con il turco la i con il punto e senza.

Due casi famosi non sono regole di lingua, e vale la pena sapere quale sia quale. La ß tedesca diventa SS in ogni lingua, perché è una regola SpecialCasing di Unicode e non una regola tedesca — ed è anche il motivo per cui la corrispondenza non è reversibile, e SS torna a ss. E un sigma greco a fine parola passa alla forma finale ς e non a σ, ovunque: è una condizione contestuale sulla posizione del carattere, non un'impostazione di lingua. Entrambi si vedono in questo strumento senza scegliere alcuna lingua.

Qui Title case e Sentence case sono meccanici

Il Title Case di questo strumento porta in maiuscolo la prima lettera di ogni parola e in minuscolo il resto. Il Sentence case porta in maiuscolo la prima lettera del testo e quella di ogni frase successiva, dove una frase termina con un punto, un punto esclamativo, un punto interrogativo o dei puntini di sospensione seguiti da uno spazio. Entrambi portano prima l'input in minuscolo, ed è questo che li rende utili su un testo arrivato URLANDO.

Sono regole volutamente meccaniche, e vale la pena spiegare l'alternativa. Le guide di stile inglesi definiscono il maiuscolo dei titoli in base a quali parole brevi restano minuscole — e non concordano fra loro sull'elenco, sul fatto di rendere maiuscola la parola dopo i due punti, né sulle preposizioni di quattro lettere o più. Applicarne una qui significherebbe consegnare convenzioni giornalistiche americane a lettori che scrivono in ebraico, giapponese o turco, dove il concetto non si trasferisce affatto. Rendere maiuscola ogni parola è prevedibile, spiegabile in qualunque lingua e facile da correggere a mano dopo.

La condizione dello spazio nel Sentence case è ciò che impedisce a 3.5 metres di diventare 3.5 Metres, dato che lì il punto è seguito da una cifra. Non risolve le abbreviazioni: e.g. this inizia comunque una frase falsa, perché sapere che «e.g.» non è una fine di frase richiede un elenco delle abbreviazioni di quella lingua. Nemmeno un apostrofo dentro una parola ne inizia una nuova, quindi it's viene reso maiuscolo una sola volta e dà It's e non It'S.

Ordinare: ordine alfabetico oppure ordine dei byte

Gli strumenti per le righe tagliano, rimuovono i duplicati, ordinano, invertono e numerano, e l'ordinamento riporta la questione della lingua una seconda volta. L'ordine alfabetico è una proprietà di una lingua, non di Unicode. Il tedesco mette ä accanto ad a: a, ä, z. Lo svedese la tratta come lettera distinta in fondo all'alfabeto: a, z, ä. Entrambi sono corretti nel proprio paese, e lo strumento usa la lingua scelta in cima alla pagina.

L'altra opzione è l'ordine per punto di codice, quello che serve quando la risposta deve coincidere con qualcos'altro. Confrontare per punto di codice è l'ordine dei byte in UTF-8, quindi riproduce esattamente ciò che producono LC_ALL=C sort, git e il confronto di stringhe predefinito della maggior parte dei linguaggi: tutte le maiuscole prima di tutte le minuscole, così B viene prima di a. Sceglietelo quando confrontate con l'output di uno strumento; scegliete l'ordinamento per lingua quando la lista la leggerà una persona.

L'ordine numerico naturale — item2 prima di item10 e non dopo — è una funzione dell'ordinamento per lingua, perciò è disponibile solo con la regola alfabetica. L'ordine dei byte non ha il concetto di numero dentro una stringa, e non ce l'ha nemmeno l'ordinamento che imita: offrirli insieme prometterebbe qualcosa che l'output non potrebbe mantenere.

Le operazioni vengono eseguite in un ordine fisso, e l'ordine conta. Il taglio avviene prima della rimozione dei duplicati, così due righe che differivano solo per uno spazio finale vengono riconosciute come la stessa. L'ordinamento avviene prima dell'inversione, così invertire significa sempre «inverti quello che sto guardando». Vengono riportati sia il numero di righe vuote sia quello dei duplicati rimossi, perché un conteggio silenzioso è il modo in cui non ci si accorge che la lista non era quella che si pensava.

Dove viene eseguito

Tutto avviene nel vostro browser. Le corrispondenze di maiuscole vengono dall'implementazione Unicode del motore JavaScript stesso e l'ordinamento da Intl.Collator, quindi le risposte concordano con l'ambiente di esecuzione che tratterà davvero le vostre stringhe e non con una tabella copiata anni fa. Nulla di ciò che incollate viene caricato, memorizzato o registrato, il che rende lo strumento sicuro su nomi, righe di log e qualunque altra cosa preferireste non inviare a un server solo per cambiarne le maiuscole.

Domande frequenti

Il mio testo viene inviato a un server?
No. Ogni conversione viene eseguita nel vostro browser usando le corrispondenze di maiuscole Unicode del motore JavaScript stesso, e nulla di ciò che incollate viene caricato o registrato.
Perché scegliendo il turco mi mostra due risultati diversi?
Perché il turco cambia la risposta. Il suo alfabeto ha sia una i con il punto sia una ı senza, quindi la maiuscola di i è İ e non I. Ogni volta che una lingua cambia un risultato lo strumento mostra accanto la risposta indipendente dalla lingua, che è quella di cui hanno bisogno identificatori e token di protocollo.
Devo usare la corrispondenza indipendente dalla lingua o quella di una lingua?
Usate quella indipendente dalla lingua per tutto ciò che leggerà una macchina: identificatori, intestazioni HTTP, chiavi di database, token di protocollo, nomi di file. Usate quella di una lingua per il testo che una persona leggerà in quella lingua. Confonderle è il classico bug della i turca.
Perché XMLHttpRequest viene convertito in XmlHttpRequest?
Perché per impostazione predefinita le sigle vengono ricomposte, come fanno lodash e diverse guide di stile importanti. Attivate l'opzione per le sigle per mantenere la sequenza di maiuscole e riavere XMLHttpRequest. Riguarda solo camelCase e PascalCase, poiché le altre forme ricompongono comunque ogni parola.
Perché utf8 resta una sola parola mentre lodash la divide?
Perché qui le cifre si attaccano alla parola che le precede, quindi utf8 e address2 passano interi. Una cifra seguita da una maiuscola invece inizia una nuova parola, ed è ciò che divide html5Parser in html5 e Parser.
Perché Title Case rende maiuscole parole brevi come «of» e «the»?
Perché la regola è meccanica di proposito. Le guide di stile inglesi non concordano fra loro su quali parole brevi restino minuscole, e le loro convenzioni non si trasferiscono alle altre lingue di questo sito. Rendere maiuscola ogni parola è prevedibile e facile da correggere a mano.
Perché non posso usare l'ordine numerico naturale con l'ordinamento per punto di codice?
L'ordine naturale è una funzione dell'ordinamento per lingua. L'ordine per punto di codice è un ordine di byte, che non ha nozione di numero dentro una stringa — e non ce l'ha nemmeno il LC_ALL=C sort che riproduce. Offrirli insieme darebbe un output non più coincidente con lo strumento imitato.
Perché ß diventa SS anche senza una lingua selezionata?
Perché quella corrispondenza è una regola SpecialCasing di Unicode e non una regola del tedesco, quindi si applica ovunque. Non è nemmeno reversibile: SS diventa ss e non di nuovo ß. Il sigma finale greco funziona allo stesso modo: dipende dalla posizione della lettera, non da una lingua.