<?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>Basmati Tree &#187; utf-8</title>
	<atom:link href="http://www.basmatitree.net/tag/utf-8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.basmatitree.net</link>
	<description>nerdish recipes for a better tomorrow</description>
	<lastBuildDate>Tue, 19 May 2009 09:31:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP &amp; UTF-8: qualche indicazione utile</title>
		<link>http://www.basmatitree.net/2008/05/20/php-utf8-qualche-indicazione-utile/</link>
		<comments>http://www.basmatitree.net/2008/05/20/php-utf8-qualche-indicazione-utile/#comments</comments>
		<pubDate>Tue, 20 May 2008 21:08:38 +0000</pubDate>
		<dc:creator>Palicao</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.basmatitree.net/?p=13</guid>
		<description><![CDATA[Una delle grandi carenze di PHP è il supporto della codifica UTF8. Questo significa che gran parte delle funzioni (in particolare quelle che agiscono su stringhe) potrebbero dare risultati inaspettati quando gli si passano come parametri stringhe multi-byte. Quindi bisogna prestare attenzione ad alcuni particolari nella realizzazione di un sito multilingua in PHP e MySQL.
In [...]]]></description>
			<content:encoded><![CDATA[<p>Una delle grandi carenze di PHP è il supporto della codifica UTF8. Questo significa che gran parte delle funzioni (in particolare quelle che agiscono su stringhe) potrebbero dare risultati inaspettati quando gli si passano come parametri stringhe multi-byte. Quindi bisogna prestare attenzione ad alcuni particolari nella realizzazione di un sito multilingua in PHP e MySQL.</p>
<p>In attesa della versione 6 di PHP che dovrebbe supportare nativamente la codifica UTF8, ecco qualche indicazione utile a tal proposito.</p>
<h3>I file e il bug del BOM</h3>
<p>Salva tutti i file che compongono l&#8217;applicazione (sia template che script PHP) in utf-8. Ho sentito parlare di un <a title="PHP BOM bug" href="http://bugs.php.net/bug.php?id=22108" target="_blank">bug</a> connesso alla presenza o meno del BOM (<a title="Byte Order Mark su Wikipedia" href="http://it.wikipedia.org/wiki/Byte_Order_Mark" target="_blank">Byte Order Mark</a>) all&#8217;inizio del file. Su Windows usando Ultra-Edit o Eclipse non ho mai sperimentato il problema, quindi se pensi che la tua applicazione dia il famoso errore &#8220;headers already sent&#8221; per questo motivo, passa ad uno di questi editor.</p>
<p>Puoi continuare a salvare i css e i javascript in formato ASCII, anche per risparmiare qualche byte, a meno che non pensi di includere delle stringhe multi-byte nel javascript.</p>
<h3>I dati</h3>
<p>Ricorda di creare i database, le tabelle e i campi in MySQL con <em>character set</em> utf8 e <em>collation </em>utf_8_general_ci. Questo può essere fatto molto facilmente se si usano strumenti come PhpMyAdmin, perchè per ognuna di queste operazioni viene data la possibilità di specificare la <em>collation</em>.</p>
<h3>La connessione</h3>
<p>Accertati che la connessione tra PHP e MySQL avvenga nel giusto formato. Pertanto, appena effettuata la connessione, esegui sempre la seguente query:</p>
<pre><em><span style="font-style: normal;">SET CHARACTER SET utf8</span>
</em></pre>
<h3>Gli headers HTTP</h3>
<p>Prima di qualsiasi output nello script, assicurati che anche la connessione HTTP avvenga in utf-8, eseguendo il seguente comando:</p>
<pre>header('Content-type: text/html; charset=utf-8');</pre>
<p>E&#8217; consigliabile, poi, ripetere l&#8217;informazione anche all&#8217;interno della pagina HTML stessa, includendo nell&#8217;<em>head </em>la riga:</p>
<pre>&lt;meta http-equiv="Content-type" value="text/html; charset=UTF-8" /&gt;</pre>
<p>Questo ovviamente nel caso più comune, ossia se l&#8217;output dello script è HTML o XHTML. Se stai producendo XML i due comandi sarebbero rispettivamente:</p>
<pre>header('Content-type: text/xml; charset=utf-8');</pre>
<p>e, all&#8217;inizio dell&#8217;XML:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;</pre>
<h3>Le funzioni &#8220;pericolose&#8221; di PHP</h3>
<p>Finita la fase preparatoria, puoi passare alla realizzazione dello script vero e proprio, momento in cui avrai a che fare con le numerose funzioni di PHP che potrebbero crearti grossi problemi se usate in un ambiente utf8 come quello appena creato. Puoi trovare un <a title="Handling UTF-8 with PHP" href="http://www.phpwact.org/php/i18n/utf-8" target="_blank">elenco minuzioso di tutte le possibili &#8220;trappole&#8221;</a> nell&#8217;ottima documentazione di <a title="PHP WACT" href="http://www.phpwact.org/" target="_blank">WACT</a>.</p>
<p>A questo punto dovrai scegliere una delle seguenti strategie per aggirare il problema:</p>
<ol>
<li>usare l&#8217;estensione mbstring impostando l&#8217;overloading delle funzioni &#8220;standard&#8221;</li>
<li>usare l&#8217;estensione mbstring sostituendo manualmente le funzioni &#8220;standard&#8221;</li>
<li>usare una libreria dedicata come <a title="PHP UTF-8 library" href="http://sourceforge.net/projects/phputf8" target="_blank">PHP UTF-8</a></li>
<li>usare PHP UTF-8 <strong>e</strong> mbstring</li>
</ol>
<p>Le alternative che ho elencato sono in ordine inverso di preferibilità.</p>
<p>La prima soluzione è infatti &#8220;quick and dirty&#8221; e può tornare molto utile se si intende adattare script già esistenti ad un ambiente utf-8. In pratica si tratta di installare l&#8217;estensione <a title="Multi Byte String PHP Extension" href="http://www.php.net/mbstring" target="_blank">mbstring </a>di PHP e poi dirgli di sostituire automaticamente molte delle funzioni &#8220;pericolose&#8221; con la loro alternativa multibyte. Per fare ciò basta inserire nel php.ini la seguente riga:</p>
<pre>mbstring.func_overload = 7;</pre>
<p>La soluzione può sembrare la migliore, ma potresti trovarti nei guai nel momento in cui vuoi lavorare, ad esempio, su un file binario o su un CSV salvato come ASCII.</p>
<p>Perciò potresti passare alla seconda soluzione, ossia sostituire manualmente i vari <em>strlen</em>, <em>strtoupper </em>eccetera in <em>mb_strlen</em>, <em>mb_strtoupper</em>&#8230;</p>
<p>Ma forse la soluzione migliore è quella di usare la libreria PHP UTF-8, che usa le funzioni mbstring qualora fossero presenti sul server o una versione alternativa per i server shared o in tutte quelle occasioni in cui non puoi installare estensioni.</p>
<h3>Le entities</h3>
<p>A questo punto hai affrontato quasi tutte le insidie (leggendo l&#8217;<a title="Handling UTF-8 with PHP" href="http://www.phpwact.org/php/i18n/utf-8" target="_blank">elenco di cui sopra</a> ne scopro sempre di più!) dell&#8217;utf-8 in PHP e puoi goderti un piccolo lato positivo: puoi utilizzare i caratteri accentati nell&#8217;HTML senza bisogno delle relative entities. Quindi perchè non sostituire la vecchia funzione htmlentities con la nuovo utf8_entities?</p>
<pre>function utf8_entities($str) {</pre>
<pre>	return htmlentities($str, ENT_QUOTES, 'UTF-8');</pre>
<pre>}</pre>
<h3>Ringraziamenti</h3>
<p>Molte delle informazioni contenute in questo tutorial sono prese dall&#8217;ottimo articolo <a title="PHP UTF-8 cheatsheet" href="http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet" target="_blank">PHP UTF-8 cheatsheet</a> di Nick Nettleton e dalla già citata documentazione di PHP WACT. Grazie ad entrambi per i preziosi consigli.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basmatitree.net/2008/05/20/php-utf8-qualche-indicazione-utile/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
