Programmatori dentro

Java XML encoding addendum n.2: i caratteri accentati

Novembre 14, 2007 · 2 Commenti

Dalle statitiche del blog vedo che uno dei termini più richiesti è xml caratteri accentati. Questo posto vuole provare a dare una soluzione di come si trattano i caratteri accentati.

Supponiamo di avere una tag il cui contenuto è:

àèìòù€

e di voler creare un file xml che contenga tali caratteri.

L’esempio con DOM4J è il seguente :

import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class TestXMLEncodingAccento {

public static void main(String[] args) throws Exception {
Document document=DocumentFactory.getInstance().createDocument();
Element e=document.addElement(“CaratteriAccentati”);
e.setText(“àèìòù€”);
OutputFormat outformat = OutputFormat.createPrettyPrint();
outformat.setEncoding(“ISO-8859-1″);
//outformat.setEncoding(“UTF-8″);
//outformat.setEncoding(“ISO-8859-15″);
FileOutputStream fos=new FileOutputStream(“c:/temp/testaccenti.xml”);
XMLWriter writer = new XMLWriter(fos, outformat);
writer.write(document);
writer.flush();
fos.close();
}

}

Il programma non fa altro che creare una stringa con i caratteri in questione, metterli in un tag e salvare un file con un certo encoding. L’encoding è la chiave di tutto in quanto determina il valore dei byte che rappresentato il carattere che vengono poi salvati su disco. “L’equazione” è carattere->sequenza di byte dipendente dall’encoding->file.

Se proviamo ognuno dei tre tipi di encoding e ogni volta apriamo il file con un editor “evoluto” dovremmo vedere i caratteri accentati sempre visualizzati correttamente. Se proviamo ad utilizzare come output System.out il risultato dipende dall’encoding della console in uso, se coincide vediamo tutto corretto altrimenti compaiono dei caratteri strani. Se compaiono dei caratteri strani (tranne per il simbolo dell’euro che è un discorso a parte) significa che il lettore non sa gestire l’encoding, ma il file è scritto bene.

Un discorso a parte merita il simbolo dell’euro, questo compare solo nel caso di encoding UTF-8 e ISO-8859-15. Perchè? Perchè ISO-8859-1 non ha nella sua mappa di traduzione simbolo->sequenza di byte tale carattere per cui non è possibile salvare il simbolo € correttamente. ISO-8859-15 è stato fatto apposta per supportare il simbolo dell’euro (e visto che la codifica utilizza un solo byte per fare spazio all’euro è stato rimosso un altro simbolo).

Alla prossima

Categorie: Pensieri sparsi · java encoding · xml caratteri accentati · xml encoding

2 risposte finora ↓

  • Filippo // Marzo 6, 2008 a 3:17 pm | Replica

    Ciao Giovanni.
    Quindi, se non ho capito male, nell’ipotesi che io debba produrre un file xml contenente caratteri particolari (tipo “àèìòù€”), per scegliere quale encoding utilizzare devo sapere chi sarà il destinatario del mio xml.
    Cioè se il destinatario è in grado di gestire UTF-8, allora posso effettuare l’encoding UTF-8, altrimenti devo usare quello più limitato (ISO-8859-1)?
    E’ quindi possibile che uno stesso xml possa essere letto “correttamente” da un destinatario e non correttamente da un altro? se sì, in questi casi quale dovrebbe essere la soluzione? produrre due/tre xml ogni volta (uno per ogni encoding … ricordando che c’è anche windows-1252 )?
    In sostanza, se dovessi realizzare ad esempio un servizio web, l’xml dato in risposta al cliente che codifica dovrebbe avere?

  • giovannicuccu // Marzo 6, 2008 a 3:59 pm | Replica

    In realtà no. se sai che chi è dall’altra parte è in grado di gestire l’encoding (es ambienti java o .net) puoi specificare l’encoding che preferisci.
    L’iso 8859 è limitato ai caratteri europei, mentre in utf-8 ci sono praticamente tutti i caratteri che ti possono servire. Se devi fare delle applicazioni multilingua (con o senza servizi web), l’utf8 è la scelta migliore. nell’iso 8859-1 il carattere euro € è assente, devi usare 8859-15. tieni conto che nel caso di web service quello che conta è l’encoding che fa l’http client come ho descritto in uno degli articoli su blog.

Lascia un Commento