2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(QA) IBM i 上のMQがサポートするユニコードについて

Last updated at Posted at 2025-09-25

首記ご質問をいただきました。MQはV8(現時点でサポート終了バージョン)です。

MQのサポートするユニコード対応について

IBM i にかぎらず、MQ全般としての情報はこちらにあります。

Unicode 変換サポート MQ V9.4.x
https://www.ibm.com/docs/ja/ibm-mq/9.4.x?topic=conversion-unicode-support

執筆時点で最新のMQ V9.4.xでは以下の記載があります。(一部省略しています)

Unicode エンコードは、UTF-16 (CCSID 1200、13488、および 17584) および UTF-8 (CCSID 1208) の 2 つの形式がサポートされています。 CCSID 1200または1208(最新のUnicodeバージョンなので)を使うべきです。
IBM® MQ は、データ変換において、ユニコード 標準で定義されているすべてのユニコード文字をサポートしています。
8.0 こ のサポー ト は、 UTF-16 サ ロ ゲー ト ペア (U+FFFF 以上の Unicode コ ー ド ポ イ ン ト を表す、 範囲 X' D800 ' から X'DFFF' ま での 2 バ イ ト の UTF-16 キ ャ ラ ク タ の対) を含む UTF-16 の完全サポー ト を含みます。 タ ーゲ ッ ト CCSID に、 UTF-16 サ ロ ゲー ト の対で表 さ れ る コ ー ド ポ イ ン ト のマ ッ ピ ン グが含まれていない場合、 その文字の対は 1 個の置換キ ャ ラ ク タ に変換 さ れます。

後段がMQ V8について説明しているようです。ところが、上記マニュアルのMQ V8.0.0を参照すると、
https://www.ibm.com/docs/ja/ibm-mq/8.0.0?topic=conversion-unicode-support
Unicode エンコードは、UCS-2 (CCSID 1200、13488、および 17584) および UTF-8 (CCSID 1208) の 2 つの形式がサポートされています。
UCS-2 という用語は、UTF-16 と交換可能な語として多用されますが、この使い方は誤りです。 UCS-2 は、各文字が 2 バイトを占める固定幅のエンコード方式です。 UTF-16 は UCS-2 のスーパーセットである可変幅のエンコード方式です。 UTF-16 には、2 バイトの UCS-2 文字に加えて、代理の対という長さ 4 バイトの文字が含まれます。 IBM® MQ はサロゲート・ペアをサポートしません。 したがって、 IBM MQ での UTF-16 および UTF-8 のサポートは、 UCS-2でエンコードできる Unicode 文字に限定されます。

とあり、MQ V8ではUTF-16はサポートされない、と解釈できます。MQ V8はUCS-2, UTF-8がサポートされると解釈していいようです。

ただし以上はあくまでMQの仕様であり、稼働するプラットフォーム(OS)により若干の差異があるようです。
上記リンクにはAIX, Windows, Linux, z/OS などは説明がありますが、IBM i はIBM i の別ページを参照しろ、と記載があります。

IBM iでのMQ ユニコード対応

上記は以下のページに情報があります。
Db2 MQ CCSID 変換
https://www.ibm.com/docs/ja/i/7.6.0?topic=db2-mq-ccsid-conversion
https://www.ibm.com/docs/ja/i/7.4.0?topic=db2-mq-ccsid-conversion

(一部省略・引用。7.5以降は機械変換で言い回しが怪しいのでV7.4から引用)

メッセージが送信されるとき、送信されるメッセージが Db2 によってジョブ CCSID に変換されることがあります。 メッセージが読み取られるか受信されるとき、指定された CCSID に MQ によって変換されることがあります。

つまり、MQはUCS-2, UTF-8をサポートするが、IBM i 上のアプリケーションからMQのデータを取り出す際(MQに送出する際)、そのジョブのCCSID(=通常はEBCDIC、日本語システムでは5026,5035, 1399)に従って文字コード変換が発生する、という事になります。(※執筆時点でIBM i はユニコードのジョブCCSIDをサポートしていません)

IBM i での文字コード変換例 MQSEND関数でIBM i からデータを送出する場合

上記マニュアル中の記載を転載しますと、

MQSEND 関数の msg-data パラメーターは、ジョブ CCSID を使用すると定義されています。 ストリングが msg-data に渡される場合、ジョブ CCSID に変換されます。 例えば、CCSID が 1200 のストリングが msg-data に渡される場合、 ジョブ CCSID(日本語では5026,5035,1399のいずれか) に変換された後にメッセージ・データが Websphere MQ に渡されます。
ストリングがビット・データとして定義されているか、またはストリングの CCSID がジョブ CCSID である場合、変換は行われません。

上記のご質問に戻るとMQを通じて送受信されるデータはユニコード(UCS-2かUTF8)なのですが、IBM i 上のジョブのメモリ空間に展開される際にいったん、CCSID 5026か5035か1399のEBCDICコードで変換されたデータがMQに渡されることになります。

さらに後続の処理についての記述を見ますと、

MQ は、MQSEND が実行されるときにはメッセージ・データの CCSID 変換を行いません。 Db2 から渡されるメッセージ・データは、変更されずに CCSID を付けて送信されます。 この CCSID を使って、メッセージの受信側にメッセージ・データの解釈方法を知らせます。送信される CCSID は、MQSEND 関数で使用されるサービスの CODEDCHARSETID に指定される値に依存します。 CODEDCHARSETID のデフォルトは -3 です。この場合、渡される CCSID がデフォルトのジョブ CCSID であることを示します。 -3 以外の値が CODEDCHARSETID に使用されている場合、呼び出し側は、 MQSEND に渡されるメッセージ・データが Db2 によってジョブ CCSID に変換されないこと、 およびその指定された CCSID でストリングがエンコードされることを確認する必要があります。

とありますので、ユニコード(USC-2,UTF-8)のデータをIBM i MQで相手先にデータ送信される際のメッセージデータは日本語の場合はCCSID 5026, 5035, 1399に変換されたデータに元のデータのCCSID(UCS-2またはUTF-8)が指定されて送信されるようです。

IBM i での文字コード変換例 IBM i MQからデータを受信する場合

メッセージが MQ スカラー関数または表関数で読み取られる場合、msg-data 戻りパラメーター (およびDb2 MQ 表関数の MSG 結果列) もデフォルトのジョブ CCSID を使用するように定義されます。 Db2 は変換を行わず、必要な変換の実行はすべて MQ に依存します。 MQがメッセージ・データを変換するかどうかは、指定したポリシーで RCV_CONVERT 値を「N」に設定することで制御できます。

指定のサービスで CODEDCHARSETID の値が -3 の場合、Db2 は、 読み取るメッセージを MQ がジョブ CCSID に変換するように指示します。 -3 以外の値が CODEDCHARSETID に使用されている場合、Db2 は、 読み取るメッセージを MQ がその CCSID に変換するように指示します。 msg-data 戻りパラメーターおよび MSG 結果列ではデフォルトのジョブ CCSID を使用するように Db2 で定義されているため、 メッセージの読み取りまたは受信に使用されるサービスでは、CODEDCHARSETID に -3 以外の値を指定することは勧められていません。

つまり、推奨されるCODEDCHARSETID = -3の場合、MQで受信したユニコードデータはいったん、日本語のCCISDに置き換えられてジョブ内に受信される、という事になります。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?