<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>change-encoding &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/change-encoding/</link>
	<description>Feed of posts on WordPress.com tagged "change-encoding"</description>
	<pubDate>Wed, 30 Dec 2009 09:36:14 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Java encoding addedum no. 4 xml all'interno dell'xml]]></title>
<link>http://giovannicuccu.wordpress.com/2008/01/22/java-encoding-addedum-no-4-xml-allinterno-dellxml/</link>
<pubDate>Tue, 22 Jan 2008 20:50:04 +0000</pubDate>
<dc:creator>giovannicuccu</dc:creator>
<guid>http://giovannicuccu.wordpress.com/2008/01/22/java-encoding-addedum-no-4-xml-allinterno-dellxml/</guid>
<description><![CDATA[Questo è il penultimo dei post che riguarda l&#8217;xml encoding e tratta un argomento che si può pr]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Questo è il penultimo dei post che riguarda l&#8217;xml encoding e tratta un argomento che si può presentare quando si ha a che fare con delle applicazioni che si basano su scambio di messaggi xml. Capita a volte che le applicazioni message oriented abbiano una struttura a due livelli:</p>
<ol>
<li>il primo livello di xml trasmette i campi generali (es il mittente, il nome del servizio, il contenuto informativo)</li>
<li>il secondo livello di xml trasmette il contenuto vero proprio ed è rappresentato da un campo del primo livello</li>
</ol>
<p>Esempio</p>
<p>&#60;message&#62;</p>
<p>&#60;sender&#62;Giovanni&#60;/sender&#62;</p>
<p>&#60;service&#62;invio_fattura&#60;/service&#62;</p>
<p>&#60;content&#62;<b>&#60;![CDATA[</b></p>
<pre>&#60;?xml version="1.0" encoding="ISO-8859-1"?&#62;
&#60;fattura&#62; 	&#60;numero&#62;2&#60;/numero&#62;  	&#60;data&#62;20080131&#60;/data&#62; ... ...  &#60;/fattura&#62;</pre>
<p><b>]]&#62;</b>&#60;/content&#62;</p>
<p>&#60;/message&#62;</p>
<p>Tale strutturazione si usa quando si vuole creare uno scheletro di comunicazione da usare per diversi servizi che vengono chiesti a dei fornitori in tempi diversi. Gli sviluppi successivi possono riutilizzare &#8220;l&#8217;infrastruttura&#8221; di comunicazione e concentrarsi solo sul contenuto senza dover configurare endpoint diversi e &#8220;menate varie&#8221;.</p>
<p>Una soluzione di questo tipo pone un problema di encoding particolare; infatti per evitare il famoso <font size="-1">&#8220;<b>Invalid byte 2 of 3-</b><b>byte UTF-8 sequence</b>&#8221; </font>ed annessi e connessi è necessario capire cosa succede se il messaggio viene trasportato via rete tramite protocollo http.</p>
<p>Il contenuto del tag content è a tutti gli effetti una stringa che, nel caso di cdata non viene toccata (si può inserire il contenuto facendo l&#8217;escaping dei caratteri, ma il messaggio diventa molto meno leggibile ad occhio nudo). La domanda da porsi è: se all&#8217;interno di CDATA ci sono dei caratteri accentati con che encoding vengono trasmessi?</p>
<p>La risposta è: a priori non è dato saperlo. Eh? Perchè?</p>
<p>Analizziamo il &#8220;viaggio&#8221; del messaggio; se si usa un web service client (tipo quelli generati da AXIS) abbiamo a disposizione un metodo di un oggetto che, presi i parametri di input, crea un xml e tramite un http client, lo invia  &#8220;come stringa&#8221; (è una semplificazione, ma serve per non perdersi nei dettagli) all&#8217;http server. l&#8217;http client specifica un encoding nell&#8217;header http; il server legge l&#8217;encoding e ricostruisce una stringa che rappresenta il messaggio xml. A questo punto sul server il web service può essere implementato tramite un metodo che accetta gli stessi parametri del client (stile AXIS) o viene fornito un albero JDOM, DOM4J o XOM da cui prelevare i dati (stile Spring Web Services). In entrambi i casi il contenuto del campo content è accedibile come stringa. Stringa = sequenza di caratteri per cui non esiste problema di encoding, la conversione byte-caratteri è stata presa in carico dall&#8217;http server o dalla libreria che implementa i meccanismi di web service.</p>
<p>Che problemi ci sono allora?</p>
<p>Che il contenuto di content deve essere dato in pasto alla nostra libreria XML preferita che crea un albero o una serie di eventi; ma nell&#8217;header del messaggio contenuto in content è specificato un encoding che non ha più alcun legame con l&#8217;encoding reale. <b>Tale informazione sull&#8217;encoding va ignorata.</b></p>
<p>Come si fa?</p>
<p>La soluzione l&#8217;ho citata nel post precedente: <b>si usa un reader al posto di un input stream</b>.</p>
<p>Ricetta facile e veloce: <b>se dobbiamo dare in pasto ad una libreria xml del contenuto che proviene da una stringa utilizziamo un reader e non un inputstream</b></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Java encoding addedum no. 3: InputStream vs Reader]]></title>
<link>http://giovannicuccu.wordpress.com/2007/12/04/java-encoding-addedum-no-3-inputstream-vs-reader/</link>
<pubDate>Tue, 04 Dec 2007 13:37:46 +0000</pubDate>
<dc:creator>giovannicuccu</dc:creator>
<guid>http://giovannicuccu.wordpress.com/2007/12/04/java-encoding-addedum-no-3-inputstream-vs-reader/</guid>
<description><![CDATA[In questo articolo porrò le fondamenta di quello che sarà l&#8217;argomento di un altro post, l]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In questo articolo porrò le fondamenta di quello che sarà l&#8217;argomento di un altro post, l&#8217;xml all&#8217;interno dell&#8217;xml.</p>
<p>Capire la differenza fra Reader ed InputStream è fondamentale se si vuole riuscire ad evitare errori di vario tipo legati all&#8217;encoding.</p>
<p>Quel e&#8217; la differenza fra InputStream e Reader?</p>
<p>Il primo ragiona in byte, il secondo in caratteri che tradotto significa: il primo non fa il decoding il secondo sì. (per OutputStream e Writer si applica il concetto complementare di encoding)</p>
<p>La differenza è &#8220;tutta&#8221; qui. Vediamo cosa significa: se in un programma che tratta XML (dove quindi l&#8217;encoding/decoding è richiesto) passo un InputStream cosa fa la libreria(DOM4J per esempio)? Legge la prima riga, il prologo con &#60;?xml cerca l&#8217;encoding e costruisce un Reader che trasforma i byte in caratteri secondo le regole del charset. Se invece alla libreria passo un reader, essa comincia  caricare i caratteri senza controllare l&#8217;encoding del prologo.</p>
<p>Quindi in un caso il prologo viene letto (e quindi viene fatta una operazione di decoding) nell&#8217;altro viene ignorato (il decoding lo ha già fatto il reader).</p>
<p>Sapere che esistono queste due possibilità è molto utile infatti ci sono casi dove il prologo e la relativa informazione sull&#8217;encoding deve essere letta (per esempio quando si legge da file system), mentre ce ne sono altri in cui deve essere ignorata (per esempio quando l&#8217;xml viene passato come stringa).</p>
<p>Nel prossimo post affronterò l&#8217;ulteriore complicazione dell&#8217;xml dentro xml, caso che può essere abbastanza frequente nel caso di webservice che si scambiano nessaggi.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Java encoding addedum no. 1]]></title>
<link>http://giovannicuccu.wordpress.com/2007/10/18/java-encoding-addedum-no-1/</link>
<pubDate>Thu, 18 Oct 2007 12:26:23 +0000</pubDate>
<dc:creator>giovannicuccu</dc:creator>
<guid>http://giovannicuccu.wordpress.com/2007/10/18/java-encoding-addedum-no-1/</guid>
<description><![CDATA[**If there are some non italian readers that wish to learn more about java encoding please leave a c]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><strong>**If there are some non italian readers that wish to learn more about java encoding please leave a comment in english and I&#8217;ll try to post more articles (english readable) on the topic.**</strong></p>
<p>Ho visto che molte delle ricerche che portano al blog hanno le parole chiava java ed encoding. Ho pensato di dedicare qualche post all&#8217;argomento.</p>
<p>Il primo e&#8217;: Come cambiare encoding ad un file?</p>
<p>Faccio copia ed incolla di un sorgente Java che preso un file con un certo encoding (da specificare esplicitamente)  ne crea una sua versione con un encoding differente.</p>
<p>public class FileReEncoder {</p>
<p>private static final int BUFFER_SIZE=2048;</p>
<p>public static void main(String[] args) throws Exception {<br />
String fileNameIn=&#8221;test1&#8243;;<br />
String fileNameOut=&#8221;test2&#8243;;<br />
String encodingIn=&#8221;UTF-8&#8243;;<br />
String encodingOut=&#8221;ISO-8859-1&#8243;;<br />
File fileIn=new File(fileNameIn);<br />
if (!fileIn.exists() &#124;&#124; !fileIn.canRead()) {<br />
System.err.println(&#8220;Il file &#8221; + fileNameIn + &#8221; non esiste o è illeggibile&#8221;);<br />
System.exit(-1);<br />
}<br />
FileInputStream fis= new FileInputStream(fileIn);<br />
InputStreamReader reader= new InputStreamReader(fis,Charset.forName(encodingIn));<br />
try {<br />
FileOutputStream fos=new FileOutputStream(fileNameOut);<br />
OutputStreamWriter writer= new OutputStreamWriter(fos, Charset.forName(encodingOut));<br />
try {<br />
char[] bufferChar=new char[BUFFER_SIZE];<br />
int charsRead=0;<br />
while ((charsRead=reader.read(bufferChar))&#62;0) {<br />
writer.write(bufferChar, 0, charsRead);<br />
}<br />
} finally {<br />
writer.close();<br />
}<br />
} finally {<br />
reader.close();<br />
}</p>
<p>}</p>
<p>}</p>
<p>Enjoy!</p>
<p>Se ci sono altre domande o cose che vorreste vedere trattate sull&#8217;argomento suggerite pure.</p>
<p><strong>**If there are some non italian readers that wish to learn more about java encoding please leave a comment in english and I&#8217;ll try to post more articles (english readable) on the topic.**</strong></p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
