IBM MQ classes for Java での文字ストリング変換

IBM® MQ classes for Java は、文字ストリング変換に CharsetEncoders および CharsetDecoders を直接使用します。 文字ストリング変換のデフォルト動作は、2 つのシステム・プロパティーを使用して構成できます。 マップできない文字を含むメッセージの処理は、com.ibm.mq.MQMD を使用して構成できます。

IBM MQ 8.0より前では、 IBM MQ classes for Java でのストリング変換は、 java.nio.charset.Charset.decode(ByteBuffer) メソッドと Charset.encode(CharBuffer) メソッドを呼び出すことによって行われていました。

このいずれかのメソッドを使用すると、誤った形式のデータまたは変換不能なデータに対してデフォルトの置換が行われます (REPLACE)。 この動作により、アプリケーションでのエラーが覆い隠され、予期しない文字 (? など) が変換データに現れることがあります。

IBM MQ 8.0 から、以前よりも効率的にそのような問題を検出するために、IBM MQ classes for Java は CharsetEncoders と CharsetDecoders を直接使用して、誤った形式のデータおよび変換不能なデータの処理を明示的に構成します。 デフォルト動作は変更され、適切な MQException をスローして、その種の問題を REPORT するようになりました。

構成

UTF-16 ( Javaで使用される文字表現) からネイティブ文字セット ( UTF-8など) への変換は エンコードと呼ばれ、反対方向への変換は デコードと呼ばれます。

デコードでは CharsetDecoders のデフォルト動作に従い、例外をスローしてエラーを報告します。

今回、エンコードとデコードの両方で 1 つの設定を使用して java.nio.charset.CodingErrorAction を指定し、エラー処理を制御します。 エンコード時に置換バイトを制御するためにもう 1 つ別の設定が使用されます。 デコード操作では、デフォルトの Java 置換ストリングが使用されます。

IBM MQ classes for Java での変換不能データ処理の構成

IBM MQ 8.0以降、 com.ibm.mq.MQMD には以下の 2 つのフィールドが含まれています。
byte[] unMappableReplacement
入力文字を変換できず、REPLACE が指定されている場合に、エンコードされたストリングに書き込まれるバイト・シーケンス。
デフォルト: "?".getBytes()
デフォルトの Java 置換ストリングは、デコード操作で使用されます。
java.nio.charset.CodingErrorAction unmappableAction
エンコードおよびデコードの際に変換不能データに対して取られるアクションを指定します。
デフォルト: CodingErrorAction.REPORT;

システム・デフォルトの設定用システム・プロパティー

IBM MQ 8.0以降、以下の 2 つの Java システム・プロパティーを使用して、文字ストリング変換に関するデフォルトの動作を構成できるようになりました。
com.ibm.mq.cfg.jmqi.UnmappableCharacterAction
エンコードおよびデコードの際に変換不能データに対して取られるアクションを指定します。 値は REPORTREPLACE、または IGNORE です。
com.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement
エンコード操作で文字をマップできない場合に適用する置換バイトを設定または取得します。デコード操作では、デフォルトの Java 置換ストリングが使用されます。

Java 文字とネイティブ・バイト表現の混同を避けるために、ネイティブ文字セット内の置換バイトを表す 10 進数として com.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement を指定する必要があります。

例えば、固有バイトとしての ? の 10 進値は、固有文字セットが ASCII ベース (ISO-8859-1 など) の場合は 63 であるのに対し、固有文字セットが EBCDIC の場合は 111 になります。
注: MQMD または MQMessage オブジェクトに unmappableAction フィールドまたは unMappableReplacement フィールドのいずれかが設定されている場合は、これらのフィールドの値が Java システム・プロパティーよりも優先されることに注意してください。 これにより、必要に応じて、 Java システム・プロパティーで指定された値をメッセージごとにオーバーライドすることができます。