Quale codifica viene utilizzata da javax.xml.transform.Transformer? [chiuso]

4

Puoi rispondere ad un paio di domande basate sul codice qui sotto (esclude i blocchi try / catch), che trasforma i file XML e XSL di input in un file XSL-FO di output:

File xslFile = new File("inXslFile.xsl");
File xmlFile = new File("sourceXmlFile.xml");
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslFile));
FileOutputStream fos = new FileOutputStream(new File("outFoFile.fo");
transformer.transform(new StreamSource(xmlFile), new StreamResult(fos));

inXslFile è codificato usando UTF-8 - tuttavia non ci sono tag nel file che lo dichiarano. sourceXmlFile è codificato in UTF-8 e potrebbe esserci un metatag all'inizio del file che lo indica.

sto attualmente utilizzando Java 6 con intenzione di aggiornamento in futuro.

  1. Quale codifica viene utilizzata durante la lettura di xslFile?
  2. Quale codifica viene utilizzata durante la lettura di xmlFile?
  3. Quale codifica verrà applicata all'outfile FO?
  4. Come posso ottenere le informazioni (proprietà) per 1 - 3? C'è una chiamata al metodo?
  5. Come possono essere alterate le proprietà in 4 - utilizzando la configurazione e dinamicamente?
  6. se noto - Dove ci sono informazioni (sito web) su questo che posso leggere - Ho guardato senza molto successo.
posta Helen Reeves 31.05.2013 - 13:32
fonte

4 risposte

4

XML è definito come UTF-8 o UTF-16 con BOM in assenza di una codifica esplicita nel prologo: link

Se stai leggendo / scrivendo un file XML usando un parser / serializzatore standard, dovresti sempre usare FileInputStream / FileOutputStream e contare sulla libreria che fa la cosa giusta.

Se stai ricevendo input da un server HTTP, devi prestare attenzione alla codifica specificata nell'intestazione Content-Type . In questo caso dovresti usare InputStreamReader per avvolgere il socket con la codifica corretta. Se non si dispone di una specifica di codifica esplicita, basta passare il flusso del socket al parser.

Allo stesso modo, se stai scrivendo XML su un server, assicurati di non creare casualmente Content-Type errato. Devi impostare in modo esplicito application/xml senza codifica e fare affidamento sul serializzatore che fa la cosa giusta.

Dovresti mai scrivere XML in una stringa e quindi scrivere quella stringa in un file. Né dovresti mai scrivere XML su FileWriter (non dovresti usare FileWriter o FileReader per nulla, non solo XML, perché usano la codifica predefinita della piattaforma).

Sfortunatamente, molte persone lo fanno (o peggio, non usano un serializzatore), quindi potresti avere un file che assomiglia all'XML ma non lo è.

    
risposta data 31.05.2013 - 16:16
fonte
2

Se sai che la codifica sarà sempre UTF-8, potresti utilizzare la classe InputStreamReader che ti consente di specificare una codifica e passare tali istanze a StreamSource . In caso contrario, mi aspetterei che il sistema utilizzi la codifica specificata nel file XML e, se non è specificato, utilizzare la codifica predefinita del sistema o fare un'ipotesi migliore (da non dipendere per essere corretta). La soluzione migliore sarebbe garantire che i file XML abbiano metadati di codifica corretti.

La codifica dell'output può essere controllata utilizzando il tag <xsl:output> . Da Java, questo può essere fatto usando metodo setOutputProperty () .

    
risposta data 31.05.2013 - 16:07
fonte
0

What encoding is used when reading the xslFile?

What encoding is used when reading the xmlFile?

How can I obtain the info (properties) for 1 - 3? Is there a method call?

Non esiste un modo chiaro per recuperare queste informazioni dall'API di Transformer. La codifica della sorgente è rilevante solo per un parser e quindi solo durante l'analisi di un particolare documento o frammento da un flusso di byte.

Immagino che tu lo chieda perché hai riscontrato problemi con la codifica e stai cercando un modo per eseguirne il debug. Un problema comune è che i documenti XML sono contrassegnati come nella codifica ABC, ma in realtà sono codificati tramite XYZ, quindi ... verifica che i tuoi documenti XML siano memorizzati nella codifica che rivendicano.

Se sei costretto a indovinare, probabilmente è codificato in Windows-1252 / Cp1252 e il documento XML dichiarerà di essere UTF-8 o non avrà una dichiarazione.

Ci sono due modi per aggirare questo:

  1. converti il file con iconv o un editor di testo come Notepad ++ o

  2. aggiungi encoding="windows-1252" all'istruzione <?xml .

Se stai per distribuire su macchine non Windows, tieni presente che una JVM è non richiesto per supportare windows-1252 / cp1252 (sebbene supportino il suo parente stretto ISO-8859-1 ):

Standard charsets

Every implementation of the Java platform is required to support the following standard charsets. Consult the release documentation for your implementation to see if any other charsets are supported. The behavior of such optional charsets may differ between implementations.

  • US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set
  • ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
  • UTF-8 Eight-bit UCS Transformation Format
  • UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order
  • UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order
  • UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark
    
risposta data 17.04.2014 - 18:49
fonte
-1

Rispondere a una parte della domanda che segue il codice funziona per me. Ciò può richiedere la codifica dell'input e convertire i dati in codifica di output.

ByteArrayInputStream inStreamXMLElement = new ByteArrayInputStream(strXMLElement.getBytes(input_encoding));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document docRepeat = db.parse(new InputSource(new InputStreamReader(inStreamXMLElement, input_encoding)));
Node elementNode = docRepeat.getElementsByTagName(strRepeat).item(0);

TransformerFactory tFactory = null;
Transformer transformer = null;
DOMSource domSourceRepeat = new DOMSource(elementNode);
tFactory = TransformerFactory.newInstance();
transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, output_encoding);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
StreamResult sr = new StreamResult(new OutputStreamWriter(bos, output_encoding));

//          StringWriter sW = new StringWriter();
//          StreamResult resultRepeat = new StreamResult(sW);

transformer.transform(domSourceRepeat, sr);
byte[] outputBytes = bos.toByteArray();
strRepeatString = new String(outputBytes, output_encoding);
    
risposta data 16.04.2014 - 20:01
fonte

Leggi altre domande sui tag