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-1047 o '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 'Cp1242 o 'ISO8859-1. Per modificare questo valore predefinito, è possibile specificare la proprietà di sistema '-Dfile.encoding sulla 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 //STDOUT e //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 sistema LANG=C ). È possibile modificare questo valore predefinito esportando la variabile di ambiente JZOS_OUTPUT_ENCODING nello 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 di ISO-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

  1. Evitare la scrittura di codice che assume un valore file.encoding predefinito, ma se è necessario eseguire il codice che lo fa, specificare la proprietà di sistema -Dfile.encoding=ISO-8859-1 sulla 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.
  2. 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.