{"id":16,"date":"2012-08-14T12:23:00","date_gmt":"2012-08-14T11:23:00","guid":{"rendered":"http:\/\/xmau.com\/wp\/voices\/2012\/08\/14\/calcolatori_e_codifiche\/"},"modified":"2014-10-23T11:04:30","modified_gmt":"2014-10-23T10:04:30","slug":"calcolatori_e_codifiche","status":"publish","type":"post","link":"https:\/\/xmau.com\/voices\/2012\/08\/calcolatori_e_codifiche\/","title":{"rendered":"Calcolatori e codifiche"},"content":{"rendered":"<p>Quando ho parlato di <a href=\"http:\/\/xmau.com\/voices\/2012\/07\/calcolatori-e-alfabeti.html\">calcolatori e alfabeti<\/a> ho barato. Pi\u00f9 precisamente, ho omesso di parlare dei vari insiemi di caratteri che assomigliavano vagamente all&#8217;ASCII, nel senso che lettere e numeri stavano al loro posto ma altri caratteri no. Chi \u00e8 vecchio come me forse ricorda ancora l&#8217;Apple ][, con i suoi caratteri in negativo (ma solo maiuscoli! O erano quelli lampeggianti? Chi se lo ricorda pi\u00f9&#8230;) Chi ha giusto qualche anno in meno invece dovrebbe riuscire a ricordarsi il font semigrafico dei primi PC IBM: la cosiddetta &#8220;<a href=\"http:\/\/en.wikipedia.org\/wiki\/Code_page_437\">code page 437<\/a>&#8220;, che per mezzo di magheggi vari permetteva anche di usare le posizioni riservate ai caratteri di controllo per fare le cornicette. E comunque Windows aveva la sua propria codifica a otto bit, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Windows-1252\">Windows-1252<\/a> (no, non ne avevano provate altre 1251! Semplicemente, i vari Windows 125x corrispondono logicamente agli ISO-8859-y, e permettono di scrivere in alfabeti diversi da quelli latini standard). Anche Apple andava avanti per conto proprio, e fino a OS X aveva il suo charset, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Mac_OS_Roman\">Mac OS Roman<\/a>. Ma anche ora che siamo pi\u00f9 o meno tutti d&#8217;accordo a usare Unicode in una versione o nell&#8217;altra non \u00e8 che le cose funzionino cos\u00ec bene&#8230;<br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/xmau.com\/voices\/appleii.png?w=250\" alt=\"[una schermata tipica di un gioco Apple - da http:\/\/www.fadden.com\/techmisc\/cassette-protect.htm]\"  align=\"left\" \/> <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/xmau.com\/voices\/Codepage-437.png\" alt=\"[Il font dei primi PC IBM - da Wikipedia, File:Codepage-437.png]\" align=\"right\" hspace=\"10\" \/><br \/>\n<!--more--> Iniziamo per esempio a prendere la vecchia codifica UCS-2: in pratica, la prima versione di Unicode con 65536 caratteri (due byte) che sarebbero stati sufficienti per qualunque alfabeto. La codifica di per s\u00e9 \u00e8 semplicissima: ogni carattere occupa due byte, e a ogni coppia di byte corrisponde un carattere. Magari il font che si sta usando non possiede quel carattere, e a video ci appare un rettangolino vuoto, o il carattere &#65533;, oppure un numerino esadecimale; ma questi sono problemi secondari, visto che con ogni probabilit\u00e0 se non abbiamo il font giusto non sapremo comunque leggere il testo, e comunque se lo inviamo a qualcun altro, magari lui o lei sapr\u00e0 leggerlo. Tutto perfetto, vero? Quasi. In che ordine vengono salvati questi due byte in un computer? Non \u00e8 dato saperlo: dipende dall&#8217;architettura hardware, insomma da come chi ha progettato la CPU trovava pi\u00f9 comodo fare per fare arrivare i byte alle varie unit\u00e0 logiche. In inglese \u00e8 stato persino coniato un termine apposito, &#8220;endianness&#8221;, tanto per dire. Il modo &#8220;big endian&#8221;, che \u00e8 quello che usa Internet negli standard e usava Motorola nei suoi chip, \u00e8 quello pi\u00f9 naturale: i bit sono tutti nell&#8217;ordine giusto. Il modo &#8220;little endian&#8221; usato da Intel invece mette a sinistra il byte meno significativo, e quindi il numero 256 non si scrive come 00000001.00000000 ma come 00000000.00000001. Occorre pertanto trovare un modo per capire se l&#8217;ordine dei byte \u00e8 quello che serve oppure no; XML se la cava perch\u00e9 i suoi file iniziano sempre con i caratteri &lt;? e quindi pu\u00f2 guardarli, altri si arrangiano.<br \/>\nCome se non bastasse, una codifica come UCS-2 per un testo in una lingua occidentale spreca met\u00e0 dello spazio, che costa poco ma \u00e8 comunque scomodo. Cos\u00ec si \u00e8 pensato a una codifica dei caratteri <b>a lunghezza variabile<\/b>: ci sono caratteri &#8220;fortunati&#8221; e meno fortunati. Il formato <a href=\"http:\/\/en.wikipedia.org\/wiki\/UTF-8\">UTF-8<\/a> \u00e8 proprio fatto cos\u00ec. Il trucco \u00e8 molto semplice: si codificano i caratteri in questo modo. (U+nnnn \u00e8 il modo che usa Unicode per definire il numero d&#8217;ordine dei caratteri, per la cronaca; ricordatevi per\u00f2 che nnnn non \u00e8 un numero decimale ma esadecimale)<\/p>\n<ul>\n<li>Se il carattere ha codice tra 0 e 127, cio\u00e8 tra U+0000 e U+007F, bastano sette bit per definirlo; si mette l&#8217;ottavo bit a zero e si usa un solo byte per definirlo.<\/li>\n<li>Se per definire il carattere occorrono da 8 a 11 bit, cio\u00e8 si va da U+0080 a U+07FF, si dividono i bit come 5+6; si fa iniziare il primo byte (logico) con i bit 110 e il secondo con 10.<\/li>\n<li>Se occorrono da 12 a 16 bit, cio\u00e8 si va da U+0800 a U+FFFF, si dividono i bit come 4+6+6; si fa iniziare il primo byte (logico) con i bit 1110 e gli altri con 10.<\/li>\n<li>Se occorrono da 17 a 21 bit, cio\u00e8 si va da U+10000 a U+1FFFFF, si dividono i bit come 3+6+6+6; si fa iniziare il primo byte (logico) con i bit 11110 e gli altri con 10.<\/li>\n<\/ul>\n<p>Di per s\u00e9 la specifica arrivava fino a 31 bit, ma visto che UTF-16 si \u00e8 fermato a 21 bit (sempre per la solita storia &#8220;ventun bit saranno sufficienti per qualunque alfabeto&#8221;) attualmente la codifica si ferma qui.<br \/>\nNotato nulla di particolare? Se andiamo a leggere in un punto a caso uno stream di byte in UTF-8, se il byte inizia per 10 sappiamo che siamo a met\u00e0 di un carattere, e possiamo spostarci indietro al pi\u00f9 di tre byte per trovare il suo inizio. Insomma, non rischiamo di avere un guazzabuglio illeggibile. Inoltre, non appena troviamo il primo byte che inizia con 1, se il secondo bit \u00e8 0 sappiamo che abbiamo un testo little endian, mentre se \u00e8 1 il testo \u00e8 big endian. In Microsoft per\u00f2 non sono mai stati troppo sicuri che la cosa funzionasse, cos\u00ec molti programmi, come per esempio Notepad, attaccano i tre byte 0xEF, 0xBB, 0xBF all&#8217;inizio di ogni file. Questi byte codificano il cosiddetto BOM, &#8220;Byte Order Mark&#8221;, che \u00e8 un carattere Unicode come tutti gli altri; guardando l&#8217;ordine dei byte nel file \u00e8 facile vedere se siamo in big endian o little endian.<br \/>\nCome ho detto, una codifica variabile va bene per noi occidentali: a parte i fortunatoni degli inglesi i cui caratteri sono tutti codificati con un byte, ne bastano comunque due per gli alfabeti latino, greco, cirillico, ebraico, arabo e per i segni diacritici. Ci sono casi sfortunati, come il simbolo dell&#8217;euro &euro; che ha bisogno di tre byte; per\u00f2 ci si pu\u00f2 accontentare. Giapponesi, cinesi e coreani no: e non \u00e8 un caso che loro prediligano spesso altre codifiche non standard ma pi\u00f9 egualitarie (UTF-16 andrebbe loro bene, ma perch\u00e9 modificare quello che gi\u00e0 funzionava loro da anni? e comunque, se proprio serve, lo standard giapponese JIS X 0221-1:2001 \u00e8 equivalente a ISO 10646-1:2000)<br \/>\nMi fermo qua, lasciandovi in contemplazione della tabella &#8220;Character Encodings&#8221; che si trova nella Wikipedia in lingua inglese&#8230; giusto per capire come il bello degli standard \u00e8 che ce ne sono cos\u00ec tanti tra cui scegliere!<br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/xmau.com\/voices\/encoding.png\" alt=\"[le pagine di Wikipedia sulle codifiche di caratteri]\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si \u00e8 fatta una faticaccia per standardizzare i primi 256 caratteri; ma superato il limite nascono altri problemi&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_post_was_ever_published":false},"categories":[16],"tags":[],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-standard"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/phh2za-g","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/posts\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":1,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"predecessor-version":[{"id":91,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/posts\/16\/revisions\/91"}],"wp:attachment":[{"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xmau.com\/voices\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}