<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Carmine Noviello &#187; byte-string</title>
	<atom:link href="http://www.carminenoviello.com/tag/byte-string/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.carminenoviello.com</link>
	<description>ilnovi&#039;s corner</description>
	<lastBuildDate>Mon, 06 Jun 2011 06:00:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Unicode in 5 minuti</title>
		<link>http://www.carminenoviello.com/2008/05/20/unicode-in-5-minuti/</link>
		<comments>http://www.carminenoviello.com/2008/05/20/unicode-in-5-minuti/#comments</comments>
		<pubDate>Tue, 20 May 2008 15:18:12 +0000</pubDate>
		<dc:creator>Carmine Noviello</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[byte-string]]></category>
		<category><![CDATA[iso8859-1]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[latin1]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.carminenoviello.name/archives/44</guid>
		<description><![CDATA[Oggi giorno nessun programmatore pu&#242; ignorare Unicode: con la diffusione di Internet e la pubblicazione dei contenuti via web &#232; diventato impossibile non conoscere questo sistema di caratteri e, grazie al fatto che sono sempre di pi&#249; i linguaggi di programmazione che lo trattano in maniera nativa, &#232; diventato molto semplice poterlo adoperare nelle proprie [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi giorno nessun programmatore pu&ograve; ignorare Unicode: con la diffusione di Internet e la pubblicazione dei contenuti via web &egrave; diventato impossibile non conoscere questo sistema di caratteri e, grazie al fatto che sono sempre di pi&ugrave; i linguaggi di programmazione che lo trattano in maniera nativa, &egrave; diventato molto semplice poterlo adoperare nelle proprie applicazioni. Sicuro??!?!</p>
<p>A leggere in giro nella rete sembrerebbe esattamente il contrario. Praticamente tutti i giorni si legge di programmatori disperati che non sanno come trattare stringhe di testo contenenti caratteri Unicode, e spesso le soluzioni trovate sono alquanto <i>na&iuml;f</i> e sbagliate. Insomma, lo Unicode &egrave; per mia esperienza la bestia nera degli informatici del nuovo millennio, nonostante il web sia pieno di ottimi tutorial molto completi per approfondire la materia. <br />
	E forse &egrave; proprio questo il nocciolo della questione: le guide, i tutorial, gli <i>howto </i>elaborati per i vari linguaggi di programmazione spesso sono troppo completi ed esaustivi. Per carit&agrave;, lungi da voler criticare il lavoro svolto da altre persone, ma per mia esperienza personale in questo tema pi&ugrave; si tiene basso il livello e meglio si comprende qual &egrave; esattamente il problema. Per poi successivamente magari approfondire tutti i dettagli per gli amanti della storia dell&#39;informatica.</p>
<p>In questo mini tutorial mi propongo di trascodificare su carta l&#39;esperimento effettuato alla <a href="http://www.pycon.it">PyCon Due</a>, e cio&egrave; presentare Unicode in soli 5 minuti. Si, avete capito bene. Vi chiedo di impiegare soltanto 5 minuti del vostro tempo, in cui vi impongo di rilassarvi e di dimenticare tutto quello che avete letto in giro fino ad ora. <br />
	Per illustrarvi gli esempi adoperer&ograve; i linguaggi di programmazione Python e Java, ma sappiate che tutto quello che dir&ograve; potr&agrave; essere direttamente riportato in qualunque altro linguaggio di programmazione come C#, Visual Basic.NET, ecc &#8211; se vi aspettavate di leggere anche &#39;PHP&#39; sappiate che ancora oggi, con PHP5, <a href="http://www.ibm.com/developerworks/library/os-php-unicode/index.html">non c&#39;&egrave; un supporto nativo alle stringhe Unicode</a>.</p>
<p>&nbsp;</p>
<p>Relax. Respiro profondo. Via.</p>
<p>&nbsp;<span id="more-44"></span></p>
<h3><span style="color: rgb(51, 51, 153);"><b>Minuto 1</b></span><b> &#8211; Lo standard ASCII 7-bit non &egrave; in grado di rappresentare tutti i caratteri di tutti gli alfabeti esistenti<br />
	</b></h3>
<p>L&#39; <a href="http://it.wikipedia.org/wiki/ASCII">ASCII</a> &egrave; uno standard di codifica dei caratteri che associa i numeri da 0 a 127 ad un carattere ben preciso (non bisogna dimenticare che i computer sanno trattare esclusivamente numeri). Nello specifico, soltanto i numeri da 32 a 126 corrispondono a caratteri stampabili, tutti gli altri sono i cosiddetti caratteri di controllo. I caratteri contemplati dallo standard ASCII sono soltanto i caratteri dell&#39;alfabeto latino (dalla A alla Z, maiuscoli e minuscoli). So gi&agrave; a cosa state pensando: &quot;<i>ma sulla mia tastiera ci sono anche le vocali accentate</i>&quot;. Ebbene questo &egrave; un punto di confusione: lo standard ASCII originario a 7 bit fu successivamente esteso a 8 bit per contemplare caratteri di alfabeti specifici (si parla per l&#39;appunto di <i>ASCII esteso</i>). Questi 128 caratteri in pi&ugrave; furono adoperati per codificare lettere specifiche dei singoli alfabeti, come le vocali accentate. Il compito di rimappare i codici numerici a lettere di un alfabeto era demandato ai cosiddetti <i>codepage</i>, che nel caso dell&#39;alfabeto italiano (e non solo) per i PC equipaggiati con MS-DOS era il <a href="http://msdn.microsoft.com/en-us/library/cc195064.aspx">codepage 850</a>. Tuttavia, se 128 caratteri aggiuntivi sono sufficienti a rappresentare tutti i caratteri degli alfabeti dei paesi &#39;occidentali&#39; (comprese le vocali accentate, lettere con dieresi, ecc), non lo sono affatto per quei paesi i cui alfabeti superano abbondantemente tale numero di caratteri (si pensi agli ideogrammi cinesi). Insomma,</p>
<div class="boxriassuntivo"><i><b>l&#39;ASCII non &egrave; lo standard idoneo per trattare tutti gli alfabeti esistenti</b></i>.</div>
<h3>&nbsp;</h3>
<h3><b><span style="color: rgb(51, 51, 153);">Minuto 2</span> &#8211; UNICODE &egrave; uno standard che associa ad un carattere un solo codice numerico</b></h3>
<p>Per aggirare questa intrinseca limitazione dell&#39;ASCII, le principali aziende del settore informatico unirono i loro sforzi per formare un consorzio con l&#39;obiettivo di standardizzare tutti i caratteri esistenti in tutti gli alfabeti possibili: lo <a href="http://www.unicode.org/consortium/consort.html"><i>Unicode Consortium</i></a>.<br />
	Lo Unicode &egrave; uno standard che assegna univocamente un numero ad ogni carattere di scrittura testi, indipendentemente dalla lingua, dalla particolare piattaforma software, dalla sua specifica rappresentazione in bit. Con Unicode ogni carattere ha il suo numero e non esistono caratteri con lo stesso numero. Ad esempio, il numero in base dieci 224 corrisponde alla lettera &#39;&agrave;&#39;; mentre il numero in base dieci 1590 alla lettera araba &#39;sad&#39; (ض). In realt&agrave; i codici Unicode sono rappresentati in esadecimale, con 4 o 6 cifre, e nello specifico nella forma &#39;U+XXXX&#39;. Ad esempio, la lettera accentata &#39;&agrave;&#39; ha rappresentazione &#39;U+00E0&#39;, mentre la lettera araba &#39;sad&#39; (ض) ha rappresentazione &#39;U+0636&#39;.</p>
<p>Usare Unicode &egrave; semplicissimo e bastano pochissimi passi.</p>
<ol>
<li>Dirigetevi sul sito web di Unicode e nello specifico nella sezione &#39;<a href="http://www.unicode.org/charts/"><i>code charts</i></a>&#39;;</li>
<li>Scegliere una tavola di una famiglia di caratteri, ad esempio la tavola <a href="http://www.unicode.org/charts/PDF/U0080.pdf">latin1</a> della famiglia degli alfabeti europei;</li>
<li>Vi apparir&agrave; un documento PDF contenente la tavola dei caratteri latin1, (di cui sotto &egrave; riportato un estratto), ed incrociando i valori delle colonne con quelli delle righe &egrave; possibile ottenere il codice Unicode del carattere desiderato.</li>
</ol>
<p><img align="middle" alt="Unicode latin1 chart" src="http://www.carminenoviello.com/wp-content/uploads/2008/05/unicode-chart.jpg" /></p>
<p>Come possiamo sfruttare le tavole Unicode nei nostri programmi? Beh, nulla di pi&ugrave; semplice: si riporta banalmente il codice Unicode del carattere desiderato nelle stringhe di testo in formato Unicode, usando la sequenza di escape &#39;\uXXXX&#39;, dove XXXX &egrave; il codice esadecimale Unicode.<br />
	Ad esempio, in Python basta scrivere:</p>
<p class="code"><code>&gt;&gt;&gt; data = u&#39;\u00E0&#39;<br />
	&gt;&gt;&gt; print data<br />
	&agrave;</code></p>
<p>In Java, &egrave; praticamente la stessa cosa:</p>
<p class="code"><code><b>public </b>class Prova {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>public static void</b> main(String[] args) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String data = &quot;\u00e0&quot;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(data);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	}</code></p>
<p>
	Fine. Non c&#39;&egrave; nessun altra informazione da aggiungere. Unicode &egrave; semplicemente questo, ed &egrave; importante sottolineare che lo Unicode non dice NULLA su come questi caratteri debbano essere rappresentati in macchina (infatti, spesso si parla di caratteri &#39;idealizzati&#39;). Questo significa che da solo Unicode non basta a poter trattare i testi con questa codifica. Insomma,</p>
<div class="boxriassuntivo"><i><b>Unicode &egrave; uno standard che assegna univocamente un numero ad ogni carattere di scrittura testi, indipendentemente dalla lingua, dalla particolare piattaforma software, dalla sua specifica rappresentazione in bit</b></i></div>
<p>&nbsp;</p>
<h3><span style="color: rgb(51, 51, 153);"><b>Minuto 3</b></span><b> &#8211; Un <i>codec </i>&egrave; una funzione che data una sequenza di caratteri Unicode restituisce una stringa di byte </b></h3>
<p>Come gi&agrave; detto nel minuto precedente, una stringa di caratteri Unicode &egrave; una sorta di stringa &#39;idealizzata&#39;, che necessita di un ulteriore trasformazione per poter essere salvata, scambiata tra sistemi, interpretata da un browser. Tale processo di trasformazione in stringa di byte (o anche stringa binaria) &egrave; demandato ad un <i>codec</i>. Questo &egrave; il passaggio pi&ugrave; delicato ed &egrave; anche quello dove si hanno tutte le difficolt&agrave; con Unicode. ASCII era una codifica che si occupava di standardizzare sia i caratteri sia la loro rappresentazione in bit. Unicode al contrario, si limita a standardizzare i caratteri lasciando ai codec la seconda funzione.</p>
<p>Un codec non &egrave; altro che&nbsp; una funzione di trasformazione: dato un carattere Unicode restituisce la corrispondente sequenza di byte. Esistono diversi codec compatibili con Unicode e la maggior parte di loro non &egrave; in grado di codificare tutti i caratteri standardizzati dallo Unicode. Ad esempio, <a href="http://en.wikipedia.org/wiki/ISO_8859-1">ISO-8859-1</a> &egrave; il codec di trasformazione dei caratteri dell&#39;alfabeto latino che, ad esempio, associa alla lettera &#39;&agrave;&#39; (U+00E0) la stringa di byte &quot;<span style="font-family: Courier New;">\xe0</span>&quot; (questa procedura di trasformazione &egrave; anche detta <i>encoding</i>). ISO-8859-1 &egrave; un codec a lunghezza fissa, ossia associa sempre e solo un byte per i caratteri che pu&ograve; codificare (ad un codec specifico per l&#39;alfabeto latino non potrete mai far codificare un ideogramma cinese). <br />
	UTF-8 (acronimo di <a href="http://en.wikipedia.org/wiki/UTF-8"><i>Unicode Trasformation Format</i></a>) &egrave; un altro codec, a lunghezza variabile, dove un carattere pu&ograve; essere rappresentato con un minimo di un byte fino ad un massimo di quattro byte. UTF-8 &egrave; in grado di rappresentare qualunque carattere dello standard Unicode e, ad esempio, associa la stringa di byte (due in questo caso) &#39;<span style="font-family: Courier New;">\xc3\xa0</span>&#39; alla lettera &#39;&agrave;&#39; (U+00E0).</p>
<p>Come fare per ottenere una stringa di byte a partire da una stringa idealizzata Unicode? Nulla di pi&ugrave; facile. In Python possiamo fare questo per mezzo del metodo &#39;<span style="font-family: Courier New;">encode()</span>&#39; di un oggetto <span style="font-family: Courier New;">unicode</span>:</p>
<p class="code"><code>&gt;&gt;&gt; a = u&#39;\u00e0&#39;<br />
	&gt;&gt;&gt; a.encode(&#39;iso8859-1&#39;)<br />
	\xe0<br />
	&gt;&gt;&gt; a.encode(&#39;utf8&#39;)<br />
	\xc3\xa0 </code></p>
<p>In Java:</p>
<p class="code"><b><code>public class </code></b><code>Prova {<br />
	&nbsp;&nbsp;&nbsp; <b>public static void</b> main(String[] args) <b>throws </b>java.io.UnsupportedEncodingException {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String data = &quot;\u00e0&quot;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] byte_string = data.getBytes(&quot;UTF8&quot;);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(byte_string);<br />
	&nbsp;&nbsp;&nbsp; }<br />
	}<br />
	</code></p>
<p>&nbsp;</p>
<p>L&#39;operazione inversa a quella di <i>encoding</i> &egrave; il <i>decoding </i>di una stringa di byte per ottenere una stringa Unicode. Supponiamo di avere un file di testo, codificato con un dato encoding, ad esempio UTF-8. Per ottenere una stringa Unicode in Python avremo:</p>
<p class="code"><code>&gt;&gt;&gt; ustr = open(&quot;filename&quot;).read().decode(&#39;UTF8&#39;)<br />
	&gt;&gt;&gt; type(ustr)<br />
	&lt;type &#39;unicode&#39;&gt;</code></p>
<p>In Java avremo:</p>
<pre class="code"><b>import </b>java.io.*;

<b>public class</b> Prova {
    <b>public static void</b> main(String[] args) <b>throws </b>java.io.UnsupportedEncodingException {
         <b>try </b>{
             BufferedReader rdr = <b>new </b>BufferedReader(
                  <b>new </b>InputStreamReader(<b>new </b>FileInputStream(&quot;filename&quot;),
                  &quot;UTF-8&quot;));
             String line = rdr.readLine();
             System.out.println(line);
         } <b>catch </b>(IOException exc) {
         System.err.println(&quot;I/O error&quot;);
     }
    }
}
</pre>
<p>&nbsp;</p>
<p>La figura sotto schematizza il processo di <i>encoding/decoding</i>.</p>
<p style="text-align: center;"><img alt="" src="http://www.carminenoviello.com/wp-content/uploads/2008/05/schemaunicode.jpg" /></p>
<p>&nbsp;</p>
<p>Riassumendo,</p>
<div class="boxriassuntivo"><i><b>Un codec &egrave; una funzione di trasformazione di un carattere Unicode in una stringa di byte serializzabile in macchina</b></i></div>
<p>&nbsp;</p>
<h3><span style="color: rgb(51, 51, 153);"><b>Minuto 4</b></span><b> &#8211; Per interagire con una stringa di byte &egrave; necessario conoscere l&#39;<i>encoding </i>con cui &egrave; stata codificata</b></h3>
<p>L&#39;ultimo concetto importante da tenere bene a mente &egrave; che in generale &egrave; indecidibile dire una stringa di byte con quale encoding &egrave; stata generata. Ad esempio, consideriamo la sequenza di due byte &#39;<span style="font-family: Courier New;">\xc3\xa0</span>&#39;. Da umani non ci risulta difficile riconoscere che siamo alla presenza della lettera &#39;&agrave;&#39; codificata in UTF-8. Tuttavia, nulla vieta di essere in presenza di due caratteri codificati con un codec a 1 byte. Ad esempio, in Python in maniera perfettamente lecita possiamo scrivere:</p>
<p class="code"><code>&gt;&gt;&gt; print u&#39;\u00E0&#39;.encode(&#39;utf&#39;8&#39;).decode(&#39;ISO-8859-1&#39;), &quot;-&quot;<br />
	&Atilde; -<br />
	</code></p>
<p>Con questo frammento di codice stiamo dicendo: prendi il carattere Unicode U+00E0 (&agrave;), codificalo con l&#39;encoding UTF-8 e la stringa di byte ottenuta decodificala con ISO-8859-1. Quello che otteniamo non &egrave; pi&ugrave; il carattere originario di partenza, perch&eacute; il primo byte &#39;\<span style="font-family: Courier New;">xc3</span>&#39; viene interpretato come il carattere &#39;&Atilde;&#39; mentre il secondo &#39;<span style="font-family: Courier New;">\xa0</span>&#39; come spazio, perch&eacute; cos&igrave; contemplati dallo standard.<br />
	Questo esempio ci fa capire che quando si manipolano dati, qualunque sia la provenienza, &egrave; importante sapere con che codec sono stati codificati. Il caso pi&ugrave; tipico si verifica quando si cerca di manipolare stringhe di byte con gli encoding di default, che nel caso di Python &egrave; &#39;ascii&#39; su tutte le piattaforme (come configurato nel file <span style="font-family: Courier New;">site.py</span>), mentre in Java &egrave; un parametro dipendente dal particolare sistema: su Windows &egrave; &#39;cp1252&#39;, come indicato dalla funzione <font face="Courier New, Courier, mono" size="2">System.getProperty(&quot;file.encoding&quot;)</font><font size="2">, ed &egrave; possibile alterarlo alla riga di comando della JVM con il parametro</font><font face="Courier New, Courier, mono" size="2"> -Dfile.encoding=&lt;codec&gt;</font>. <br />
	Ad esempio, sempre dall&#39;esempio di prima, adoperando l&#39;encoding di default di Python abbiamo:</p>
<p class="code"><code>&gt;&gt;&gt; data=open(&quot;curr.txt&quot;).read().decode()<br />
	Traceback (most recent call last):<br />
	&nbsp; File &quot;C:\Documents and Settings\cnoviello\Desktop\pro.py&quot;, line 1, in &lt;module&gt;<br />
	&nbsp;&nbsp;&nbsp; data=open(&quot;curr.txt&quot;).read().decode(&#39;ascii&#39;)<br />
	UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xef in position 0: ordinal not in range(128)<br />
	</code></p>
<p>ottenendo un messaggio di errore molto noto a tutte le persone che hanno avuto a che fare con problemi di gestione dello Unicode. Altra alternativa &egrave; rappresentata dalla funzionalit&agrave; di &#39;replace&#39; della funzione &#39;<span style="font-family: Courier New;">decode()</span>&#39;: &egrave; possibile specificare al decodificatore di sostituire tutte le sequenze di byte che non hanno corrispondenza nel codec con il carattere di sostituzione Unicode U+FFFD (il famigerato � che tipicamente visualizzano i browser quando non sanno decodificare correttamente una sequenza di byte).</p>
<p class="code"><code>&gt;&gt;&gt; print u&#39;\u00e0&#39;.encode(&#39;utf8&#39;).decode(&#39;ascii&#39;, &#39;replace&#39;)<br />
	��<br />
	</code></p>
<p>E&#39; importante, quindi, che l&#39;applicazione abbia una gestione consistente dell&#39;encoding della fonte dati: si fissa un codec e si continuer&agrave; ad adoperarlo sempre. A meno di non sapere con esattezza che cosa si sta facendo. Ad esempio, &egrave; molto semplice convertire stringhe di byte codificate in un dato encoding sorgente in uno nuovo. Il seguente codice Java fa proprio questo:</p>
<pre class="code"><b>public static byte</b>[] convert(<b>byte</b>[] data, String startEncoding, String targetEncoding) {
      //Si decodifica la stringa di byte grazie al costruttore della
      //classe String, ottenendo una stringa Unicode
      String str = new String(data, srcEncoding);

      //Si ricodifica la stringa dato un encoding prefissato
      <b>byte</b>[] result = str.getBytes(targetEncoding);

      <b>return </b>result;
}
</pre>
<p>Un discorso analogo pu&ograve; essere fatto nel caso dei documenti HTML. Ricordarsi sempre di specificare l&#39;encoding dei propri documenti tramite la direttiva:</p>
<pre class="code" id="line1"><code>&lt;<span class="start-tag">meta</span><span class="attribute-name"> http-equiv</span>=<span class="attribute-value">content-type </span><span class="attribute-name">content</span>=<span class="attribute-value">&quot;text/html; charset=UTF-8&quot;</span>&gt;</code></pre>
<p>&nbsp;</p>
<p>Riassumendo,</p>
<div class="boxriassuntivo"><i><b>Ha senso parlare di stringhe di byte soltanto se si conosce l&#39;encoding con cui &egrave; stata codificata<br />
	</b></i></div>
<h3>&nbsp;</h3>
<h3><span style="color: rgb(51, 51, 153);"><b>Minuto 5</b></span><b> &#8211; Utilizzare sempre il codec UTF-8</b></h3>
<p>Dagli esempi visti in precedenza emerge che la scelta del codec da utilizzare per i propri dati non &egrave; banale, ed &egrave; intrinsecamente connessa con la tipologia di caratteri che si andr&agrave; a gestire. Se ci si limita ai soli caratteri dell&#39;alfabeto latino, la classica codifica ISO-8859-1, nota anche come latin1, o la cp1252 di Windows (quella di default per le localizzazioni di Windows per i paesi &#39;occidentali&#39;) &egrave; pi&ugrave; che sufficiente. Tuttavia, questi encoding non sono in grado di codificare caratteri non latini (si provi per esercizio a codificare in ISO8859-1 il carattere Unicode U+03A9 che corrisponde alla lettera greca &#39;&Omega;&#39;), e soprattutto nel caso di applicazioni web potrebbero essere la scelta meno adatta. Per questo motivo, oggi UTF-8 &egrave; l&#39;encoding diventato standard nel mondo Web, ed &egrave; consigliabile sviluppare le proprie applicazioni per gestire stringhe di byte codificate con questo <i>codec</i>.</p>
<p>Riassumendo,</p>
<div class="boxriassuntivo"><i><b>Utilizzare UTF-8 come encoding standard per la codifica di stringhe Unicode<br />
	</b></i></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Come visto, occorrono pochi minuti per apprendere le basi di Unicode. I concetti di base sono quelli. Bisognerebbe poi accennare al fatto che Unicode nasce per essere retrocompatibile con ASCII 7bit (i primi caratteri sono proprio quelli dell&#39;ASCII), cos&igrave; come molti codec hanno come sottoinsieme i codepage pi&ugrave; diffusi dell&#39;ASCII esteso. Ma questi sono dettagli che oggi si possono ignorare senza problemi.</p>
<p>Successivamente alla pubblicazione di questo articolo, &egrave; nata una discussione sul forum <a href="http://forum.ubuntu-it.org/index.php/topic,194890.0.html">programmazione di Ubuntu-it</a> in cui mi hanno fatto notare che la rappresentazione interna di stringe in Java &egrave; UTF-16, come <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html">riportato qui</a>. Tuttavia, ci&ograve; non toglie che &egrave; importante sapere sempre qual &egrave; la codifica dei propri dati in ingresso, e non affidarsi ai default encoding della particolare piattaforma.</p>
<p>
	Per concludere, qualche riferimento per approfondire. Il riferimento pi&ugrave; citato della rete &egrave; senza ombra di dubbio:<br />
	<a href="http://www.joelonsoftware.com/articles/Unicode.html">http://www.joelonsoftware.com/articles/Unicode.html</a><br />
	Ai pythonisti consiglio vivamente la lettura di questo tutorial che io reputo il migliore:<br />
	<a href="http://boodebr.org/main/python/all-about-python-and-unicode">http://boodebr.org/main/python/all-about-python-and-unicode</a><br />
	Se avete ereditato dei dati di cui non sapete nulla circa l&#39;encoding adoperato, vi consiglio di dare uno sguardo al modulo <span style="font-family: Courier New;">chardet</span>:<br />
	<a href="http://chardet.feedparser.org/">http://chardet.feedparser.org/</a><br />
	Infine, Wikipedia &egrave; un ottimo punto di partenza per le varie specifiche:<br />
	<a href="http://en.wikipedia.org/wiki/Unicode">http://en.wikipedia.org/wiki/Unicode</a><br />
	<a href="http://en.wikipedia.org/wiki/UTF-8">http://en.wikipedia.org/wiki/UTF-8</a><br />
	<a href="http://en.wikipedia.org/wiki/ISO_8859-1">http://en.wikipedia.org/wiki/ISO_8859-1</a><br />
	<a href="http://unicode.org/">http://unicode.org/</a></p>
<p>&nbsp;</p>
<p><i>Vi sar&ograve; grato se lascerete eventuali commenti e considerazioni. O magari mi direte se questo breve tutorial &egrave; stato utile o no.</i></p>
<p>Come dite?!?!? Non ho detto tutto??!? Ah gi&agrave; <img alt="" src="http://www.carminenoviello.com/wp-content/plugins/fckeditor-for-wordpress-plugin/smiles/msn/teeth_smile.gif" /> Non ho detto cosa significa l&#39;ideogramma 简, che si legge &#39;jiǎn&#39;. Ebbene significa &#39;semplice&#39; (come Unicode, no?!?!), ma anche &#39;semplificare&#39;; il suo codice Unicode &egrave; U+7B80 e la rappresentazione in UTF-8 &egrave; &#39;<span style="font-family: Courier New;">\xe7\xae\x80</span>&#39;, quindi 3 byte.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carminenoviello.com/2008/05/20/unicode-in-5-minuti/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

