出力エンコードの制御

Java™ VM では、オペレーティング・システムに関係なく、ストリングと文字は Unicode で表されます。 異なるオペレーティング・システムが異なる文字セット・エンコードをネイティブに使用するため、エンコードを制御するために以下のメカニズムが使用されます。

  • Java の 'file.encodingシステム・プロパティ。 このプロパティーは、文字がバイトに変換されるとき、またはバイトから変換されるときに使用されるデフォルト文字を指定します。 z/OS®では、このプロパティのデフォルト値は、'IBM-1047や'IBM-273などのEBCDIC文字セットのバリアントです。 WindowsおよびほとんどのUNIXオペレーティング・システムでは、このプロパティのデフォルト値は、'Cp1242または'ISO8859-1ようなASCII文字セットのバリアントです。 このデフォルトを変更するには、Javaアプリケーションの実行時に、コマンドラインでシステム・プロパティ「-Dfile.encoding」を指定する。 詳細については、Java SDKオプションとシステム・プロパティを参照してください。
  • JZOS バッチ・ランチャーは、JVM の System.out および System.err ストリームを //STDOUT および //STDERR DD データ・セットにリダイレクトします。 これらのストリームがリダイレクトされると、JZOS は Zutil.getDefaultPlatformEncoding() メソッドによって返されるエンコードを使用するようにそれらを変更します。 デフォルトでは、このエンコードは現行ロケールのエンコードであり、多くのインストール済み環境では IBM-1047 になります ( LANG=C システム環境変数が設定されていることを前提とします)。 このデフォルトを変更するには、 //STDENV 構成スクリプトで JZOS_OUTPUT_ENCODING 環境変数をエクスポートします。

    java.io.PrintStream クラスはロー・バイトを書き込むためのインターフェースもサポートしているため、バッチ・ランチャーはロー・バイトを現行の Java ファイル・エンコードから JZOS デフォルト・オペレーティング・システム・エンコードに変換することもできます。 このトランスコーディングは、両方のコード・セットが単一バイト・エンコードである場合にのみ使用可能であり、環境変数 JZOS_ENABLE_OUTPUT_TRANSCODING=falseを設定することによって使用不可にすることができます。

  • Java コーディングのベスト・プラクティスは、特定のデフォルトの file.encoding 値を想定しないことですが、Java コードが ASCII ファイル・エンコードを想定するのは一般的です。 この想定は、エンコードを指定せずに XML を生成または構文解析するなど、微妙な方法で行われる可能性があります。 多くの場合、 ISO-8859-1の ASCII ファイル・エンコードを使用してこれらのアプリケーションを実行する必要があります。 Apache Tomcat など、広く使用されている一部の Java アプリケーションには、この設定を必要とするコードが含まれています。
  • アプリケーションがASCIIデフォルトのファイル・エンコーディングで実行される場合、EBCDICでエンコードされたMVSデータセットにアクセスするときは、特にEBCDICエンコーディングを使用しなければならない。 この目的のために、 Zutil.getDefaultPlatformEncoding() メソッドを使用して、現在のオペレーティング・システムのエンコードを取得します。

ベスト・プラクティス

  1. デフォルトの file.encoding 値を想定するコードを作成しないようにします。ただし、デフォルト値を想定するコードを実行する必要がある場合は、Java アプリケーションの実行時にコマンド行で -Dfile.encoding=ISO-8859-1 システム・プロパティーを指定します。 いずれにしても内部 Unicode を何かに変換する必要があるため、この設定によってパフォーマンスが影響を受けることはありません。
  2. アプリケーションが MVS データ・セットにアクセスする場合は、 Zutil.getDefaultPlatformEncoding() メソッドを使用してエンコードを指定します。 JZOS Toolkit ポータブル・ファイル入出力クラスは、MVS データ・セットに対してこのオペレーティング・システム・エンコードを使用するように既に実装されています。 詳しくは、 FileFactory クラスを使用した、オペレーティング・システムに依存しないテキスト・ファイル入出力を参照してください。