Controllo della codifica di output
In una Java™ VM, indipendentemente dal sistema operativo, le stringhe e i caratteri sono rappresentati in Unicode. Poiché diversi sistemi operativi utilizzano una diversa codifica della serie di caratteri in modo nativo, i seguenti meccanismi vengono utilizzati per controllare la codifica:
- La proprietà di sistema Java '
file.encoding. Questa proprietà specifica il carattere predefinito da utilizzare quando i caratteri vengono convertiti in o da byte. Su z/OS®, il valore predefinito per questa proprietà è una variante dei set di caratteri EBCDIC, come 'IBM-1047o 'IBM-273. In Windows e nella maggior parte dei sistemi operativi UNIX, il valore predefinito di questa proprietà è una variante del set di caratteri ASCII, come 'Cp1242o 'ISO8859-1. Per modificare questo valore predefinito, è possibile specificare la proprietà di sistema '-Dfile.encodingsulla riga di comando quando si esegue l'applicazione Java. Per ulteriori informazioni, vedere Opzioni e proprietà di sistema dell'SDK Java. Il programma di avvio batch JZOS reindirizza i flussi JVM System.out e System.err ai dataset DD
//STDOUTe//STDERR. Quando questi stream vengono reindirizzati, JZOS li modifica per utilizzare la codifica restituita dal metodo Zutil.getDefaultPlatformEncoding() . Per impostazione predefinita, questa codifica è la codifica della locale corrente, che per molte installazioni èIBM-1047(presumendo che sia impostata la variabile di ambiente del sistemaLANG=C). È possibile modificare questo valore predefinito esportando la variabile di ambienteJZOS_OUTPUT_ENCODINGnello script di configurazione//STDENV.Poiché la classe java.io.PrintStream supporta anche le interfacce per la scrittura di byte non elaborati, il programma di avvio batch transcodifica anche i byte non elaborati dalla codifica del file Java corrente alla codifica del sistema operativo predefinito JZOS. Questa transcodifica è disponibile solo se entrambi i set di codici sono codifiche a byte singolo e possono essere disabilitati impostando la variabile di ambiente
JZOS_ENABLE_OUTPUT_TRANSCODING=false.- Una procedura ottimale di codifica Java consiste nel non assumere un particolare valore predefinito
file.encoding, tuttavia è comune che il codice Java assuma una codifica file ASCII. Questo presupposto può verificarsi in modi sottili, ad esempio generando o analizzando XML senza specificare una codifica. Spesso è necessario eseguire queste applicazioni con una codifica file ASCII diISO-8859-1. Alcune applicazioni Java ampiamente utilizzate, come ad esempio Apache Tomcat, includono il codice che richiede questa impostazione. - Quando un'applicazione viene eseguita con una codifica di file predefinita ASCII, deve utilizzare specificamente una codifica EBCDIC quando accede a set di dati MVS codificati in EBCDIC. Utilizzare il metodo Zutil.getDefaultPlatformEncoding() per ottenere la codificazione del sistema operativo corrente, a questo scopo.
Best practice
- Evitare la scrittura di codice che assume un valore
file.encodingpredefinito, ma se è necessario eseguire il codice che lo fa, specificare la proprietà di sistema-Dfile.encoding=ISO-8859-1sulla riga comandi quando si esegue l'applicazione Java. Questa impostazione non ha un impatto sulle prestazioni poiché Unicode interno deve essere comunque convertito in qualcosa. - Quando un'applicazione accede ai data set MVS, specificare la codifica utilizzando il metodo Zutil.getDefaultPlatformEncoding() . Le classi I/O dei file portatili del toolkit JZOS sono già implementate per utilizzare questa codifica del sistema operativo per i dataset MVS. Per ulteriori informazioni, consultare Operating system independent text file I/O with the FileFactory class.