<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinavil Dev</title>
    <description>The latest articles on DEV Community by Vinavil Dev (@vinavildev).</description>
    <link>https://dev.to/vinavildev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048472%2F455f3439-75e3-4ec8-820a-68b0979075d6.png</url>
      <title>DEV Community: Vinavil Dev</title>
      <link>https://dev.to/vinavildev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinavildev"/>
    <language>en</language>
    <item>
      <title>Come funziona davvero l'algoritmo del codice fiscale italiano</title>
      <dc:creator>Vinavil Dev</dc:creator>
      <pubDate>Tue, 04 Aug 2026 13:25:27 +0000</pubDate>
      <link>https://dev.to/vinavildev/come-funziona-davvero-lalgoritmo-del-codice-fiscale-italiano-lo</link>
      <guid>https://dev.to/vinavildev/come-funziona-davvero-lalgoritmo-del-codice-fiscale-italiano-lo</guid>
      <description>&lt;p&gt;Ogni italiano ha sedici caratteri che lo identificano, e quasi nessuno sa da&lt;br&gt;
dove vengono. Non sono casuali: sono il risultato di un algoritmo pubblicato&lt;br&gt;
nel decreto ministeriale del 23 dicembre 1976, deterministico e completamente&lt;br&gt;
ricostruibile. Se conosci nome, cognome, data e luogo di nascita di una&lt;br&gt;
persona, il suo codice fiscale lo calcoli a mano su un foglio.&lt;/p&gt;

&lt;p&gt;Ho implementato quell'algoritmo per un sito di calcolatori fiscali e poi l'ho&lt;br&gt;
estratto in una libreria open source. Questo è quello che ho imparato per&lt;br&gt;
strada, compresi i due punti dove quasi tutte le implementazioni sbagliano.&lt;/p&gt;
&lt;h2&gt;
  
  
  Le prime sei lettere: cognome e nome
&lt;/h2&gt;

&lt;p&gt;Le prime tre lettere vengono dal cognome: si prendono le consonanti in ordine,&lt;br&gt;
e se non bastano si aggiungono le vocali.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ROSSI&lt;/code&gt; → consonanti &lt;code&gt;RSS&lt;/code&gt; → &lt;strong&gt;RSS&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;BIANCHI&lt;/code&gt; → consonanti &lt;code&gt;BNCH&lt;/code&gt;, prime tre → &lt;strong&gt;BNC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se il cognome è troppo corto si completa con la X:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LI&lt;/code&gt; → consonante &lt;code&gt;L&lt;/code&gt; + vocale &lt;code&gt;I&lt;/code&gt; → &lt;code&gt;LI&lt;/code&gt; + padding → &lt;strong&gt;LIX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Il nome segue la stessa logica &lt;strong&gt;con un'eccezione&lt;/strong&gt;: se le consonanti sono&lt;br&gt;
quattro o più, non si prendono le prime tre ma la &lt;strong&gt;prima, la terza e la&lt;br&gt;
quarta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MARIO&lt;/code&gt; → consonanti &lt;code&gt;MR&lt;/code&gt; (solo due) → &lt;code&gt;MR&lt;/code&gt; + vocale &lt;code&gt;A&lt;/code&gt; → &lt;strong&gt;MRA&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;FRANCESCO&lt;/code&gt; → consonanti &lt;code&gt;FRNCSC&lt;/code&gt; (sei) → 1ª, 3ª, 4ª = &lt;code&gt;F&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt; → &lt;strong&gt;FNC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;È la regola che rompe la maggior parte delle implementazioni fatte in fretta,&lt;br&gt;
e in Italia i nomi con quattro consonanti sono comunissimi.&lt;/p&gt;
&lt;h2&gt;
  
  
  La data di nascita, e il trucco del sesso
&lt;/h2&gt;

&lt;p&gt;Due cifre per l'anno, poi una lettera per il mese secondo questa sequenza:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A B C D E H L M P R S T
gen feb mar apr mag giu lug ago set ott nov dic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le lettere saltate (F, G, I, N, O, Q) servono a evitare ambiguità in lettura.&lt;/p&gt;

&lt;p&gt;Poi due cifre per il giorno, con una particolarità: &lt;strong&gt;per le donne si somma&lt;br&gt;
40&lt;/strong&gt;. Chi è nata il 15 avrà &lt;code&gt;55&lt;/code&gt;. È il modo con cui l'algoritmo codifica il&lt;br&gt;
sesso senza spendere un carattere in più: 01-31 uomini, 41-71 donne.&lt;/p&gt;
&lt;h2&gt;
  
  
  Il luogo: i codici Belfiore
&lt;/h2&gt;

&lt;p&gt;Quattro caratteri per il comune di nascita, secondo il codice catastale (detto&lt;br&gt;
Belfiore): Roma è &lt;code&gt;H501&lt;/code&gt;, Milano &lt;code&gt;F205&lt;/code&gt;, Napoli &lt;code&gt;F839&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Chi è nato all'estero usa il codice dello stato, che inizia sempre per &lt;code&gt;Z&lt;/code&gt;:&lt;br&gt;
Francia &lt;code&gt;Z110&lt;/code&gt;, Germania &lt;code&gt;Z112&lt;/code&gt;, Stati Uniti &lt;code&gt;Z404&lt;/code&gt;. La città estera non entra&lt;br&gt;
nel codice: due persone nate a Parigi e a Lione hanno lo stesso &lt;code&gt;Z110&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il dettaglio che quasi tutte le librerie ignorano: servono anche i &lt;strong&gt;comuni&lt;br&gt;
soppressi&lt;/strong&gt;. Chi è nato in un comune che oggi non esiste più mantiene il&lt;br&gt;
codice storico, e un archivio che contenga solo i comuni attuali sbaglierà il&lt;br&gt;
calcolo per un pezzo della popolazione anziana.&lt;/p&gt;
&lt;h2&gt;
  
  
  Il carattere di controllo
&lt;/h2&gt;

&lt;p&gt;L'ultimo carattere è un checksum sui quindici precedenti. Ogni carattere vale&lt;br&gt;
un numero, ma &lt;strong&gt;il valore dipende dalla posizione&lt;/strong&gt;: c'è una tabella per le&lt;br&gt;
posizioni dispari e una per le pari.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;somma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;somma&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;DISPARI&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PARI&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controllo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;somma&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La tabella dei pari è banale (&lt;code&gt;0&lt;/code&gt;→0, &lt;code&gt;A&lt;/code&gt;→0, &lt;code&gt;B&lt;/code&gt;→1...), quella dei dispari è&lt;br&gt;
una sequenza apparentemente arbitraria (&lt;code&gt;0&lt;/code&gt;→1, &lt;code&gt;1&lt;/code&gt;→0, &lt;code&gt;2&lt;/code&gt;→5, &lt;code&gt;3&lt;/code&gt;→7, &lt;code&gt;4&lt;/code&gt;→9,&lt;br&gt;
&lt;code&gt;5&lt;/code&gt;→13...) scelta per massimizzare la capacità di rilevare errori di&lt;br&gt;
trascrizione, compresa l'inversione di due caratteri adiacenti.&lt;/p&gt;

&lt;p&gt;È il motivo per cui un codice fiscale scritto male viene quasi sempre&lt;br&gt;
scoperto: cambia una lettera e il checksum non torna.&lt;/p&gt;
&lt;h2&gt;
  
  
  L'omocodia: il caso che rompe i validatori
&lt;/h2&gt;

&lt;p&gt;Qui arriva la parte che manda in crisi i validatori scritti male.&lt;/p&gt;

&lt;p&gt;L'algoritmo &lt;strong&gt;non garantisce l'unicità&lt;/strong&gt;. Due persone con dati anagrafici&lt;br&gt;
simili possono generare lo stesso codice. Quando succede, l'Agenzia delle&lt;br&gt;
Entrate assegna al secondo soggetto un codice modificato: &lt;strong&gt;le cifre vengono&lt;br&gt;
sostituite da lettere&lt;/strong&gt;, partendo da destra, secondo questa tabella:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0→L  1→M  2→N  3→P  4→Q  5→R  6→S  7→T  8→U  9→V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e il carattere di controllo viene ricalcolato sul codice modificato.&lt;/p&gt;

&lt;p&gt;Conseguenza pratica: esistono codici fiscali perfettamente validi che hanno&lt;br&gt;
&lt;strong&gt;lettere dove un validatore ingenuo si aspetta cifre&lt;/strong&gt;. Se il tuo form&lt;br&gt;
rifiuta un codice con una lettera in posizione 7, stai rifiutando cittadini&lt;br&gt;
italiani con un codice regolarmente assegnato.&lt;/p&gt;

&lt;p&gt;La validazione corretta è: riporta le lettere alle cifre secondo la tabella,&lt;br&gt;
poi verifica il carattere di controllo sul codice originale.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;POSIZIONI_CIFRE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// per ognuna, se non è una cifra, sostituisci secondo la tabella&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  L'altro tranello: i caratteri non latini
&lt;/h2&gt;

&lt;p&gt;Questo l'ho scoperto scrivendo i test. Il modo standard di togliere gli&lt;br&gt;
accenti in JavaScript è:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NFD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\u&lt;/span&gt;&lt;span class="sr"&gt;0300-&lt;/span&gt;&lt;span class="se"&gt;\u&lt;/span&gt;&lt;span class="sr"&gt;036f&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funziona per &lt;code&gt;à&lt;/code&gt;, &lt;code&gt;è&lt;/code&gt;, &lt;code&gt;ò&lt;/code&gt;: la normalizzazione NFD le scompone in lettera base&lt;br&gt;
più diacritico, e il diacritico viene rimosso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non funziona&lt;/strong&gt; per i caratteri latini estesi dove il segno fa parte del&lt;br&gt;
glifo e non è scomponibile: &lt;code&gt;Đ&lt;/code&gt; (serbo, croato), &lt;code&gt;Ł&lt;/code&gt; (polacco), &lt;code&gt;Ø&lt;/code&gt; (danese,&lt;br&gt;
norvegese), &lt;code&gt;ß&lt;/code&gt; (tedesco), &lt;code&gt;Æ&lt;/code&gt;. Questi sopravvivono alla normalizzazione, poi&lt;br&gt;
il filtro &lt;code&gt;[^A-Z]&lt;/code&gt; li &lt;strong&gt;cancella&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Risultato: per un nome come &lt;code&gt;Đorđe&lt;/code&gt; le due &lt;code&gt;Đ&lt;/code&gt; spariscono e il codice esce&lt;br&gt;
sbagliato. Che non è un caso di scuola, considerando quante persone con nomi&lt;br&gt;
serbi, polacchi o scandinavi vivono in Italia.&lt;/p&gt;

&lt;p&gt;La soluzione è una tabella di traslitterazione esplicita, applicata &lt;strong&gt;prima&lt;/strong&gt;&lt;br&gt;
della normalizzazione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TRANSLITTERA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Đ&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ł&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ø&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;O&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ß&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Æ&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  La libreria
&lt;/h2&gt;

&lt;p&gt;L'ho pubblicata come &lt;code&gt;codice-fiscale-it&lt;/code&gt;: TypeScript, zero dipendenze,&lt;br&gt;
licenza MIT, con l'archivio completo dei comuni (compresi i soppressi) e degli&lt;br&gt;
stati esteri.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;codice-fiscale-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;calcolaDaComune&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verificaCodiceFiscale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decodificaCodiceFiscale&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;codice-fiscale-it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;calcolaDaComune&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;cognome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rossi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mario&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sesso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;giorno&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mese&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;anno&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1980&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;comune&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Roma&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; 'RSSMRA80A01H501U'&lt;/span&gt;

&lt;span class="nf"&gt;verificaCodiceFiscale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RSSMRA80A01H501U&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// =&amp;gt; true&lt;/span&gt;

&lt;span class="nf"&gt;decodificaCodiceFiscale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RSSMRA80A01H501U&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; { sesso: 'M', giorno: 1, mese: 1, annoStimato: 1980,&lt;/span&gt;
&lt;span class="c1"&gt;//      belfiore: 'H501', omocodia: false, controlloValido: true }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codice su &lt;a href="https://github.com/VinavilDev/codice-fiscale-it" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Due cose che nessuna libreria può fare
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Non può generare il codice omocodico.&lt;/strong&gt; La variante la decide solo l'Agenzia&lt;br&gt;
delle Entrate quando rileva il conflitto: il calcolo produce sempre il codice&lt;br&gt;
base. Se il risultato non coincide con la tessera sanitaria, fa fede la&lt;br&gt;
tessera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non può ricavare il secolo con certezza.&lt;/strong&gt; L'anno ha due cifre: &lt;code&gt;58&lt;/code&gt; può&lt;br&gt;
essere 1958 o 2058. Si può solo stimare usando l'anno corrente come pivot, e&lt;br&gt;
va detto esplicitamente all'utente invece di far finta che il dato sia certo.&lt;/p&gt;




&lt;p&gt;L'algoritmo nasce dal motore di&lt;br&gt;
&lt;a href="https://quantomispetta.it/calcolo-codice-fiscale" rel="noopener noreferrer"&gt;quantomispetta.it&lt;/a&gt;, dove&lt;br&gt;
ogni calcolo viene mostrato passo per passo con la norma di riferimento.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>italy</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
