メッセージ・データ変換
異なる方法で文字や数字を表現する環境間で IBM® MQ メッセージを送信する場合、データ変換が必要になります。 例えば、 Linux® (ASCIIエンコーディング標準)と z/OS® (EBCDICエンコーディング標準)のように、異なる文字エンコーディング標準を使用するオペレーティング・システム間でメッセージを送信する場合があります。 ドイツ語と日本語のように、ロケールが異なるマシン間でメッセージを送信することがあります。 また、数字のバイトオーダーが異なるシステム間でメッセージを送信することもあるでしょう。 さらに、メッセージのフォーマットがデータ変換に影響する可能性もある。 例えば、 CICS® に対する IBM MQ メッセージは、アプリケーション・データだけでなく CICS ヘッダーも含んでいるので、テキストだけのメッセージとは異なる処理が必要です。
IBM MQ は、データ変換が必要ない場合でも、データ変換ルーチンを実行します(たとえば、データ表現が似ている2つのシステム間でメッセージを送信する場合など)。 これらのルーチンは作業が必要ないと判断するかもしれないが、 IBM MQ のトレースでは、 IBM MQ でメッセージデータが処理されるたびに、 xcsQueryCCSIDType ルーチンの呼び出しが常に表示される。
データ変換に必要な情報
- コード化文字セット ID
符号化文字集合識別子 (CCSID)は、符号化方式識別子、文字集合識別子、コードページ識別子、および文字データを一意に識別するその他の情報の集合を含む16ビットの番号である。 これらの識別子は、文字データを識別し、データ変換処理中にデータの整合性を維持するための IBM アーキテクチャの一部である。 登録されているCCSIDのリストなど、このアーキテクチャの詳細については、オンラインで入手可能な文字データ表現アーキテクチャの PDFを参照してください。
CCSIDは、文字と文字以外のデータを'00'から'FF'までの16進数値(漢字など256ポジションで表現できないアルファベットに使われるDBCS(ダブルバイト文字セット)CCSIDでは'0000'から'FFFF')に割り当てる。 あるCCSIDから別のCCSIDへの変換に使われるCCSID変換テーブルは、一般に文字データと制御文字を変換する。 よく知られているCCSIDには、1208( UTF-8 )や500(主に z/OS )で使用されているEBCDID CCSID)などがある。 サポートされるCCSIDのリストについては、 コードページ変換を参照のこと。
- マシンエンコーディング
データ変換の文脈では、 エンコードとは、プラットフォームが数値データを表現するために使用する方法を意味する。 番号の最下位バイトと最上位バイトの順序は、プラットフォームのエンディアンによって異なる場合がある。 例えば、 IBM Z ハードウェア上の z/OS はビッグエンディアン(数値の最下位バイトが最上位アドレス、最上位バイトが最下位アドレス)であるのに対し、 x86 ハードウェア上の Windows はリトルエンディアン(ビッグエンディアンとはバイトが逆順)である。 つまり、数字437は16進法では z/OS の X’01BF’、 Windows の X’BF01’ として表される。 IBM Power® はリトルエンディアンかビッグエンディアンのどちらかである。 そのため、同じCCSIDを使用するプラットフォーム間で受け渡しする場合でも、数値データの変換が必要になる場合がある。
IBM MQ では、整数、パックド・デシマル、浮動小数点エンコーディングを表す値が組み合わされ、プラットフォームのマシンエンコーディングを表す1つの値が生成される。 個々の値は、以下のマシンエンコーディングをカバーしている:- ノーマル(ビッグエンディアン)
- 逆(リトルエンディアン)
- IEEEノーマル(標準 IEEE 浮動小数点フォーマット、ビッグエンディアン)
- IEEE逆(標準 IEEE 浮動小数点フォーマット、リトルエンディアン)
- System/390 ( 浮動小数点フォーマット)IBM Z
- Format
フォーマットは、 IBM MQ メッセージの送信者が、メッセージのデータの性質を受信者に示すために使用する名前である。
IBM MQ には、 で始まるいくつかのメッセージ・フォーマットが組み込まれています。 MQ 例えば、MQFMT_STRING。 これらの書式は、例えば文字列、 CICS データ、 IBM MQ イベントに関する情報、あるいは受信キュー・マネージャが実行するためのプログラマブル・コマンド・フォーマット(PCF)コマンドなどがメッセージに含まれていることを示すために使用することができます。 独自のフォーマットを定義することもできる。
キュー・マネージャーはまた、メッセージのフォーマットを設定するかもしれない。 例えば、キュー・マネージャがメッセージを配送できない場合、メッセージの先頭に新しいヘッダを追加し、MQFMT_DEAD_LETTER_HEADER というフォーマットで、メッセージが配送されなかったことを示し、そのメッセージをデッド・レター(未配信メッセージ)・キューに入れます。
IBM MQ コンバージョンの内容とその理由
- メッセージ記述子:メッセージを識別し、その優先度や有効期限、メッセージを送信したアプリケーションに関する情報、メッセージに含まれるアプリケーション・データに関する情報(CCSID、マシン・エンコーディング、フォーマットを含む)など、メッセージに関するさまざまな制御情報を含む。
- アプリケーション・データ:受信側のアプリケーションで処理される、メッセージの送信に使われるデータ。
- チャンネル・コミュニケーション
各キューマネージャには CCSID があり、これはマルチプラットフォームでのキューマネージャの作成で説明されているように、キューマネージャを作成する際に自動的に設定されます(後で変更することも可能です)。 2つの IBM MQ キューマネージャ間のチャネルが開始されると、2つのキューマネージャはチャネル通信に使用するCCSIDとマシンエンコーディングをネゴシエートする。 このCCSIDと符号化スキームは、次に IBM MQ の送信セグメントヘッダ( IBM MQ のトレースを見ると、キューマネージャ間で渡されるのを見ることができるかもしれない IBM MQ 制御ブロック)とメッセージ記述子の符号化に使用される。 メッセージ・ディスクリプタは、アプリケーションがメッセージをキューに入れるときに、アプリケーションによって作成され、入力されます。 メッセージ記述子内のデータは,ローカルのキューマネージャの文字セットとエンコーディング(キューマネージャのCCSIDとローカルのマシンのエンコーディングによって決定されます),あるいは,アプリケーションがアプリケーションの場合は,クライアントシステムの文字セットとエンコーディング(クライアントまたはサーバのCCSIDの選択を参照してください)でなければなりません。 IBM MQ MQI client アプリケーションであれば,クライアントシステムの文字セットとエンコーディング( クライアントまたはサーバの CCSID の選択参照)でなければなりません。 IBM MQ 記述子が作成されたプラットフォームに関係なく、メッセージ記述子の内容を理解する必要があるため、、メッセージ記述子は自動的に変換される。 IBM MQ
メッセージ記述子の制御情報は、すべてが文字データというわけではない。次の表に示すように、ある情報は(使用中のCCSIDに従って)文字データとして変換され、ある情報は(使用中のエンコーディングに従って)数値データとして変換され、ある情報は変換されずに渡される:フィールド名 フィールドの長さ(バイト オフセット として変換される StrucId 4 ‘00’x 文字 バージョン 4 ‘04’x 数字 レポート 4 ‘08’x 数字 MsgType 4 ‘0C’x 数字 Expiry 4 ‘10’x 数字 Feedback 4 ‘14’x 数字 Encoding 4 ‘18’x 数字 CodedCharSetId 4 ‘1C’x 数字 Format 8 ‘20’x 文字 優先順位 4 ‘28’x 数字 Persistence 4 ‘2C’x 数字 MsgId 24 ( ‘18’x ) ‘30’x Byte CorrelId 24 ( ‘18’x ) ‘48’x Byte BackoutCount 4 ‘60’x 数字 ReplyToQ 48 ( ‘30’x ) ‘64’x 文字 ReplyToQMgr 48 ( ‘30’x ) ‘94’x 文字 UserIdentifier 12 ( ‘0C’x ) ‘C4’x 文字 AccountingToken 32 ( ‘20’x ) ‘D0’x Byte ApplIdentityData 32 ( ‘20’x ) ‘F0’x 文字 PutApplType 4 ‘110’x 数字 PutApplName 28 ( ‘1C’x ) ‘114’x 文字 PutDate 8 ‘130’x 文字 PutTime 8 ‘138’x 文字 ApplOriginData 4 ‘140’x 文字 GroupId 24 ( ‘18’x ) ‘144’x Byte MsgSeqNumber 4 ‘15C’x 数字 オフセット 4 ‘160’x 数字 MsgFlags 4 ‘164’x 数字 OrginalLength 4 ‘168’x 数字 注: MsgId, CorrelId, Accounting Tokenおよび GroupId フィールドは文字データとはみなされないため、そのようには変換されない。 多くのアプリケーションはこれらのフィールドに文字データを入れるが、メッセージがASCIIとEBCDICプラットフォーム間で送信され、受信アプリケーションがこれらのフィールドを読むことができる必要がある場合、アプリケーション(またはユーザー終了)はこれらのフィールドを変換しなければならない。 IBM MQ 例えば、 に フィールドの作成を許可した場合、そのフィールドは厳密には文字データではなくなる。 IBM MQ MsgIdメッセージ・ディスクリプタの詳細については、 MQMD - メッセージ・ディスクリプタを参照のこと。
- 受信側のアプリケーションが使用できるようにアプリケーションデータを処理する
一般的に、 IBM MQ はアプリケーションデータを自動的に変換しない。なぜなら、変換せずに渡したい場合があるからである(Java アプリケーションは例外であることは後述する)。 したがって、アプリケーションデータの変換を要求しなければならない。
送信側のアプリケーションは、メッセージをキューに入れる前に、適切なメッセージ記述子フィールドを設定することによって、アプリケーション・データのCCSID、エンコーディング、フォーマットを指定します。 アプリケーションは実際の値または IBM MQ 特殊な値。たとえば、データがメッセージを送信するキュー マネージャーと同じ CCSID を使用していることや、データがアプリケーションが実行されているマシンと同じエンコードを使用していることを示す文字列です。 アプリケーションデータには、ヘッダーに続くアプリケーションデータの異なるCCSID、エンコーディング、フォーマット情報を指定するヘッダーを含めることもできる。 MQIアプリケーション用のこれらのフィールドの詳細については、『 Field details for MQMD 』の「 CodedCharSetId, Encoding」および「Format」のセクションを参照のこと。 (他のアプリケーションタイプでは、オプションは異なりますが同等のオプションがあります。たとえば、 IBM MQ classes for JMS JMS フィールドとプロパティーおよび対応する MQMD フィールドのリストにあるように、JMS_IBM_Character_Set プロパティーを持ちます。
以下の IBM MQ メッセージの例では、メッセージ内のアプリケーション・データの CCSID が 850、マ シン・エンコーディングが 546、フォーマットが MQEVENT(このメッセージに MQ イベントに関する情報が含まれていることを示す)であることが示されている:****Message descriptor**** StrucId : 'MD ' Version : 2 Report : 0 MsgType : 8 Expiry : -1 Feedback : 0 Encoding : 546 CodedCharSetId : 850 Format : 'MQEVENT ' Priority : 0 Persistence : 0 MsgId : X'414D512073617475726E2E71756575650005D30033563DB8' CorrelId : X'000000000000000000000000000000000000000000000000' BackoutCount : 0 ReplyToQ : ' ' ReplyToQMgr : 'saturn.queue.manager ' ** Identity Context UserIdentifier : ' ' AccountingToken : X'0000000000000000000000000000000000000000000000000000000000000000' ApplIdentityData : ' ' ** Origin Context PutApplType : '7' PutApplName : 'saturn.queue.manager ' PutDate : '19970417' PutTime : '15115208' ApplOriginData : ' ' GroupId : X'000000000000000000000000000000000000000000000000' MsgSeqNumber : '1' Offset : '0' MsgFlags : '0' OriginalLength : '104' **** Message **** length - 104 bytes 00000000: 0700 0000 2400 0000 0100 0000 2C00 0000 '....→.......,...' 00000010: 0100 0000 0100 0000 0100 0000 AE08 0000 '................' 00000020: 0100 0000 0400 0000 4400 0000 DF07 0000 '........D.......' 00000030: 0000 0000 3000 0000 7361 7475 726E 2E71 '....0...saturn.q' 00000040: 7565 7565 2E6D 616E 6167 6572 2020 2020 'ueue.manager ' 00000050: 2020 2020 2020 2020 2020 2020 2020 2020 ' ' 00000060: 2020 2020 2020 2020受信側のアプリケーションは、アプリケーションがキューからメッセージを受け取ったときに、データ変換を要求することができる。 たとえばMQIアプリケーションでは、 MQGET コールで MQGMO_CONVERT オプションを指定してデータ変換を要求する。 キュー・マネージャーは、変換が必要かどうかをチェックし、必要であればデータを変換する。 これらのチェックには、例えば、メッセージ記述子のCCSIDとエンコーディングが、受信アプリケーションが期待するCCSIDとエンコーディングと一致するかどうかが含まれる。 受信側のMQIアプリケーションは、MQGETコールで MsgDesc パラメータを設定することで、期待する値を指定する。 メッセージ受信時に MQ が行うチェックとデータ変換処理の詳細については、 変換処理を参照。
アプリケーション・データのCCSIDとエンコーディングが IBM MQ ( コード・ページ変換と マシン・エンコーディングを参照)でサポートされており、フォーマットが組み込みの IBM MQ フォーマットであれば、 IBM MQ 、組み込みの変換ルーチンを使用してデータ変換を実行できる。 そうでない場合は、アプリケーション・プログラマーが、 データ変換終了として知られるユーザー終了プログラムで、変換コードを供給しなければならない。 IBM MQ は、これらのユーザー終了を作成するのに役立つスケルトン構造とユーティリティを提供する。 詳しくは、 データ変換終了の書き方を参照のこと。
以下は、メッセージのデータの種類に応じたデータ変換アプローチの例である:- メッセージはすべて数値データ
- アプリケーション・データがすべて数値データで、メッセージを渡す2つのプラットフォームの数値エンコーディング方式が同じであることがわかっている場合、データを変換する必要はありません。 2つのプラットフォームの数値データエンコーディングスキームが異なる可能性があると思われる場合、あるいは将来そのような事態になることを想定している場合は、 IBM MQ 、データ変換に使用するデータ変換出口を提供してください。
- メッセージはすべて文字データ
- アプリケーションデータがすべて文字データである場合、 IBM MQ 。 メッセージを送信する MQI アプリケーションでは、MQMD メッセージ記述子の Format フィールドを MQFMT_STRING に設定します。 この値は、 IBM MQ 、メッセージがすべて文字列データで構成されていることを示す。
- メッセージは数字と文字が混在している
- メッセージに数値データと文字データが混在している場合、 IBM MQがデータを変換するために使用するデータ変換出口を指定する必要があります。
注: IBM MQ classes for Java、 IBM MQ classes for JMS、 IBM MQ classes for Jakarta Messaging を使用しているアプリケーションでは、 Java コード内で自動的にデータ変換が行われます。例えば、 Java メソッドを使用してメッセージ・テキストを取得する場合などです。 Cアプリケーションのような他のアプリケーションとのこの違いは、 Java アプリケーションが、数値やテキストを、その内部表現とメッセージで使用するためのエンコードされたフォーマットとの間で変換しなければならないからです。 それでもキュー・マネージャーによるデータ変換を要求することはできるが、データが2度変換されることになるので、そうしたくないかもしれない。 IBM MQ classes for Java を使ってメッセージを処理する方法については、 IBM MQ classes for Javaでメッセージを処理するを参照してください。 IBM MQ classes for JMS 、 IBM MQ classes for Jakarta Messaging で利用可能なデータ変換の詳細については、 JMSメッセージ変換を参照のこと。あるいは、システム管理者は、 IBM MQ Sender、Server、Cluster-receiver、Cluster-senderチャネルの CONVERT オプションをYESに設定することで、メッセージ送信時に変換を要求することができる。 メッセージは受信キュー・マネージャの CCSID を用いて変換される。 メッセージ・チャンネルによるデータ変換は、通常、他の形式の変換が不可能な場合にのみ使用される。
メッセージを入れたり受け取ったりする際の常識
- アプリケーションが使用しているキュー・マネージャの CCSID をメッセージに継承させるために、 MQMD.CodedCharSetId フィールドを MQCCSI_Q_MGR に設定します。 (MQCCSI_INHERITも同じ意味だが、シナリオによっては使用できない) メッセージ・ディスクリプタの CodedCharSetId ・フィールドは入力フィールドでもあり出力フィールドでもあるので、この設定は一般的なやり方である。 したがって、アプリケーションがMQPUTとMQGETの両方の呼び出しに同じMQMD構造体を使用している場合、 IBM MQ 、このフィールドに取得したすべてのメッセージのCCSIDが格納される。 これらのメッセージのうちの 1 つがキュー・マネージャの CCSID と同じ CCSID を使用しておらず、アプリケーションがメッセージを変換しなかった場合、このフィールドはアプリケーションが次の MQPUT 呼び出しを行う際に期待されない値に変更されます。 アプリケーションが受信メッセージの変換を試みたとしても、MQGET 呼び出しの結果、予期しないリターン・コード(MQRC_TRUNCATED_MSG_ACCEPTED など)が返された場合、メッセージは未変換のままとなり、 CodedCharSetId フィールドに未変換メッセージの CCSID が設定されます。注: クライアント・アプリケーションでは、MQCCSI_Q_MGR はリモート・キュー・マネージャの CCSID ではなく、アプリケーション・ロケールの CCSID を指します。 すべての場合において、 MQMD.CodedCharSetId フィールドを MQCCSI_Q_MGR に設定するとき、アプリケーションは CCSID がメッセージ内の文字列データを正しく表していることを確認しなければならない。アプリケーションがキューからメッセージを取得するとき、メッセージ・ディスクリプタの
CodedCharSetIdフィールドの値と、アプリケーションが MQGET コールの MsgDesc パラメータで指定した値を比較する必要があります。 2つの値が異なる場合、アプリケーションはメッセージ内の文字デー タを変換するか、データ変換の出口があればそれを使う必要があるかもしれ ません。 - MQMD.Encoding フィールドをMQENC_NATIVEに設定する。 この設定は、メッセージ・データのエンコーディングを、アプリケーションを実行しているマシンのエンコーディングと同じにすることを指定します。 アプリケーションがキューからメッセージを取得するとき、メッセージ記述子の Encoding フィールドの値を、アプリケーションが実行されているマシン上の定数 MQENC_NATIVE の値と比較する必要があります。 2つの値が異なる場合、アプリケーションはメッセージ内の数値デー タを変換するか、データ変換出口があればそれを使用する必要があります。
- メッセージのデータの性質に応じて、 MQMD.Format フィールドを設定する。 組み込み書式(名前が
MQで始まる)のいずれかを使用するか、適切なものがない場合は、独自の書式を定義することができます(名前はMQで始まってはいけません)。 独自のフォーマットを作成して使用する場合は、MQGMO_CONVERT オプションを指定したときにアプリケーションがメッセージを取得できるように、データ変換終了を記述する必要があります。 組み込みフォーマットの1つであるMQFMT_NONEは、データの性質が未定義であることを示します。 IBM MQ 、アプリケーションがMQGMO_CONVERTオプションを指定して変換を要求しても、このようなメッセージは変換されません。 - メッセージの送信時(MQI MQPUTコールなど)ではなく、メッセージの受信時(MQI MQGETコールなど)にデータを変換する。 各転送でデータ変換を行うことはリソースを浪費する可能性があり、各転送は、転送中のキュー・マネージャでデータ変換が失敗した場合に予期せぬチャネル・エラーを引き起こす危険性があります。 しかし、状況によっては、メッセージを送信する際にデータを変換した方が良い場合もある。 以下に例を示します。
- 受信側のアプリケーションがメッセージを変換できない場合。 例えば、アプリケーションや受信キュー・マネージャーが正しい文字セットを持っていない。
- JMS アプリケーションがJMS 以外のアプリケーションにメッセージを送るとき。 メッセージにテキストや数値が含まれている場合、送信側アプリケーションは、データのJVM内部表現をメッセージで使用するためのエンコード形式に変更するために、いずれにせよ変換する必要があります。 この変換が受信側のアプリケーションで使用できるデータを生成するのであれば、受信側での変換は必要ないので、このアプローチの方が効率的である。
- アプリケーションが多言語である場合、アプリケーションがキューから取得するメッセージのCCSIDを事前に知ることができないかもしれません。 たとえば、韓国語とドイツ語のメッセージをASCIIで IBM i 。 しかし、ドイツ語のアクセント文字や韓国語のマルチバイト文字は、EBCDICの単一のCCSIDでは表現できない。 ひとつの解決策は、言語ごとに別のキューを使うことです。そうすれば、メッセージを受け取ったときに、アプリケーションで適切なCCSIDを指定することができます。
潜在的な問題
- 提供されている IBM MQ マクロは、すべての構造体がパックされていることを想定している。 しかし、C言語では、ほとんどのプラットフォームで、文字データと数値データの間にある構造体の境界が単語境界でない場合、パディング文字を入れる傾向がある。 アプリケーションでこの問題に対処することができます:
- IBM MQ for z/OS で、データ構造を以下のように宣言する:
詳細については、 z/OS の各バージョンのドキュメントにある _Packed 修飾子を参照のこと(たとえば 3.1.0 )._Packed struc_name xxxx - IBM MQ for AIX® で、以下のコンパイラー・オプションを指定する:
詳細については、 AIX の各バージョンのドキュメントにある「 データの整列 」を参照してください(たとえば 16.1.0 ).-qalign=packed - IBM MQ for Windows では、コード中のプラグマ指示文として以下の行のいずれかを使用する:
詳しくは、 Windows のドキュメントを参照。 例えば、#pragma _Packed or #pragma pack(1)packpragma。
- IBM MQ for z/OS で、データ構造を以下のように宣言する:
- INTとLONGのデータ型は、その長さがアーキテクチャーとオペレーティング・システムに依存するため、使用を避けること。 代わりに MQINT64 や MQLONG のような IBM MQ データ型を使用する。
- スレッディング・モデルと非スレッディング・モデルの両方をサポートする UNIX プラットフォーム、または複数の異なるスレッディング・モデルでは、モデルごとにデータ変換出口をコンパイルする。 そうでない場合、異なるアプリケーションまたは IBM MQ チャネルコード(送信者チャネルの定義で CONVERT(YES)を指定した場合)のどちらかによって呼び出されると、出口が見つからない可能性があり、MQRC_FORMAT_ERROR (2110, x’83E’ ) エラーまたは _r または _d バージョンの出口が見つからないというメッセージを受け取る可能性があります。 詳しくは、 AIX または Linux システムのための IBM MQ 用のデータ変換出口の書き方を参照のこと。
- アプリケーション・データをユニコードで送受信したい場合、いくつかの制限が適用されます。 アプリケーションがメッセージを送受信するとき、メッセージ記述子で Unicode CCSID を指定してデータ変換をトリガーする必要があります。 送信側チャネルの CONVERT オプションを YES に設定することによってデータ変換をトリガしないでください。この変換は常に受信側キューマネージャの CCSID に変換され、キューマネージャの CCSID は UTF-16 あるいはいくつかのプラットフォームでは UTF-8 にはできないからです。 多言語アプリケーションをサポートするためにUnicodeを使用するための2つのアプローチを紹介します:
- クライアントまたはサーバーで、すべてのメッセージ・データをUnicodeに変換またはUnicodeから変換し、トランスポート・レイヤーとして IBM MQ 。 クライアントやサーバーの処理はすべてユニコードで行われます。 このアプローチは、 IBM MQ 変換サービスを使用せず、ユニコードとオペレーティング・システム・コードページ間の優れたオペレーティング・システム・コンバータ(例えば、 AIX または Windows )を持つクライアントとサーバーに特に適用可能です。
- IBM MQ 、変換を実行する。 このアプローチでは、両端のキュー・マネージャがUnicodeとの間で変換を実行できる必要がある。
様々なプラットフォームにおけるユニコードの IBM MQ サポートについては、 ユニコード変換サポートを参照してください。
- EBCDICへの、またはEBCDICからの文字の変換で問題が発生した場合(特に感嘆符)、 z/OS キュー・マネージャのCCSIDが、アプリケーションがデータを期待するコードページと一致していることを確認してください。 フォールバックCCSIDである500には、他のEBCDIC CCSIDとは異なる16進数値を持つ様々な文字が含まれている。 これらの違いについては、 z/OS 変換サポートを参照。 このような問題が発生した場合、 CSQ6SYSP マクロを使用して QMCCSID パラメータを設定し、 z/OS キューマネージャの CCSID を変更することを検討してください。 デフォルトのCCSIDの説明や、どのCCSIDが使用されているかを判断する方法など、詳しくは Using CSQ6SYSP をご覧ください。
- AIX で、チャンネルからのメッセージを表示する際に変換に問題があるという報告が時々あり、キューマネージャが日本語のような非ラテン語ロケールで動作している場合、この問題は inetd デーモンによって起動されるリスナープロセスが C ロケールで動作していることに起因している可能性があります。 デフォルトのデータ変換を有効にするか、 inetd デーモンが呼び出すプログラムをシェルスクリプトに変更することで、この問題を回避できる。 シェルスクリプトはロケール環境変数を設定し、 IBM MQ リスナープログラムを呼び出す。
- Microsoft プログラマーは、 ウェブサイトの Microsoft Use code pages in Windows appsの UTF-8 記事で説明されているように、 コードページを使用することを提案する。 UTF-8 しかし、アプリケーションは他のコードページを使うことができ、 Windows は、文字表現が異なる2つのシステム・コードページ・グループ( Windows コードページとOEMコードページ)をサポートしている。 誤ったコードページが使用された場合、データ変換に問題が生じる可能性がある。 例えば、アプリケーションによって Windows コードページで作成されたデータを送信する場合がありますが、データを送信するキュー・マネージャはOEMコードページで作成されているため、MQPUT呼び出しのデフォルト変換ではOEM CCSIDが使用されます。 メッセージを送受信する際には、必ず正しいコードページを指定してください。 あるいは、キュー・マネージャのCCSIDを変更することを検討してください。これは、アプリケーションが1つのコードページ・グループにしかメッセージを作成しない場合には、より良い方法かもしれません。
CCSID換算表
Linux および Windows では、変換表は IBM MQ で提供されている。 AIX と IBM i では、変換テーブルは IBM MQ とオペレーティング・システムの両方から提供される。 IBM MQ から提供される変換テーブルは、ラウンドトリップ・インテグリティを提供する傾向がある。データの一部があるCCSIDから別のCCSIDに変換され、また元に戻るとき、元のデータは回復される。 ラウンドトリップ・テーブルは、すべての文字に異なるマッピングを割り当てる。 ある文字が送信側CCSIDにのみ存在し、受信側CCSIDには存在しない場合、変換処理がラウンド・トリップできるように、任意の、しかしユニークなマッピングが割り当てられる。 変換テーブルを作成する別の方法は、送信側CCSIDには存在するが受信側CCSIDには存在しないすべての文字を代替文字にマッピングすることである。 このようなテーブルはラウンドトリップ・インテグリティを提供しない。データの一部があるCCSIDから別のCCSIDに変換されて戻ってきたとき、元のデータが復元できない可能性がある。 オペレーティングシステムに付属している変換表は、このタイプであることが多い。 未知の文字を特別に扱う必要がある場合は、要件を満たす変換テーブルやアルゴリズムを使用して、アプリケーション内でデータ変換を行うことを検討してください。
- IBM MQ for AIX
AIX の換算表は /usr/lib/nls/loc/iconvTable である。
コンバーターは AIX でコードセット名を使用する。 これらの名前は通常 IBM-xxxx 。 xxxx はCCSID番号。 しかし、以下の表に示すような例外も存在する:CCSID 説明 コードセット名 819 ラテン西欧 ISO8859-1 912 ラテン 東欧 ISO8859-2 915 キリル文字 ISO8859-5 1089 アラビア語 ISO8859-6 813 ギリシャ語 ISO8859-7 916 ヘブライ語 ISO8859-8 920 トルコ語 ISO8859-9 950 TraditionalChinese big5 954 5050 33722 日本語 IBM-eucJP 970 韓国語 IBM-eucKR 964 中国語 (繁体字) IBM-eucTW 1383 中国語 (簡体字) IBM-eucCN 1051 HP-UX ラテン語 IBM-1051 285 ドイツ語EBCDIC IBM-273 /usr/lib/nls/loc/iconvTable の表はSBCSの変換にのみ使用される。 これらのテーブルは、 AIX genxlt コマンドを使用して生成することができます(このコマンドの詳細については、 AIX の各バージョンのドキュメントの関連トピックを参照してください(例 : genxlt コマンド ))。 IBM MQ for AIX また、新しいDBCS(ダブルバイト文字セット)といくつかのSBCS(シングルバイト文字セット)の変換をサポートするために uconv メソッドを使用しています。 uconvメソッドのテーブルはもっと複雑だ。 これらの表は、 uconvdef コマンドを使用して生成することができます(詳しくは、 AIX ドキュメント、例えば uconvdef コマンドを参照してください)。 uconvメソッドで変換がサポートされているかどうかを判断するには、以下のチェックを行う:- /usr/lib/nls/loc/uconvTable ( iconvTable ではなく uconvTable )ディレクトリに、from-codeset用とto-codeset用の2つのファイルがあることを確認する。
- /usr/lib/nls/loc/iconv ディレクトリに、ファイル
from-codeset_to-codesetからファイル /usr/lib/nls/loc/iconv/Universal_UCS_Conv へのシンボリックリンクがあることを確認する。
iconv コマンドを使用すると、インストールされている変換テーブルをテスト目的で使用することができます。 次のコマンドを入力します。
ここで、iconv -f fromcodeset -t tocodeset fromfile > tofilefromcodesetはfromfileファイルのコードセット、tocodesetはtofileファイルのコードセットです。- IBM MQ for Linux
- 変換テーブルは /opt/mqm/lib/iconv ( /opt/mqm はデフォルトの IBM MQ インストールディレクトリ)にあります。
使用される変換コードは Windows と同様である。
表の名前は、コードページ番号の16進数を連結したもので、500から850への変換は表 01F40352.tbl。 変換テーブル・ディレクトリ・ファイルでは、 readme.ccs 、出荷されたテーブルのほとんどが記述されている。
- IBM MQ for Windows
- 変換テーブルは C:\mqm\conv\table ( C:\mqm はデフォルトの IBM MQ インストールディレクトリ)にあります。
Windowsのテーブルの名前は、コードページ番号の16進数を連結したものであるため、500から850への変換はテーブル 01F40352.tbl。 コンバージョンテーブルディレクトリでは、ファイル readme.ccs 、出荷されたテーブルのほとんどが記述されている。
トレース (Windows, UNIX and IBM i)
トレースを見ると、関数 xcsCCSIDCompatible からのリターンコード xecX_W_INCOMPATIBLE_CCSIDS x’10806111’or decimal 0276848913 はエラーではない。 このコードは、関数に渡された2つのCCSIDは有効だが、オブジェクト名についてもデータ変換が必要であることを示している。 コードは、この変換を実行するために関数を呼び出す。
変換テーブルが見つからない場合は、使用されているCCSIDとコードセット名が表示される。 初期化中、トレースはデフォルト変換が選択されているかどうか、選択されている場合はどのコードページが選択されているかを示す。
デフォルトのデータ変換
デフォルトのデータ変換は、異なる国の言語で動作するキュー・マネージャのネットワークがあり、一部のCCSID間でのデータ変換がサポートされていない場合に便利です。
先に説明したように、 IBM MQ 、メッセージを転送するためには、いくつかのメッセージデータを自動的に変換しなければならない。 CCSID間の変換は、両方のCCSIDが単一の言語または類似の言語グループに関連する場合にサポートされる。 CCSIDが異なる国の言語グループを表す場合、通常、変換は失敗し、チャンネルは開始されずconversion not supportedというメッセージが表示された。 例えば、 IBM MQ 、CCSID850と500はどちらも西欧の言語に適用されるため、変換することができる。 IBM MQ CCSID 850とCCSID 1025(キリル文字を使用する言語用のEBCDICコード化された文字セット)の間の変換はできません。
IBM MQ オブジェクトの命名 」で説明されているように、通常は A-Z、a-z、0-9、およびいくつかの特殊文字です。 このデータを変換するには、 IBM MQ 、そのデータがASCIIとEBCDICのどちらの文字エンコーディング標準を使用しているかを知るだけでよく、あとは1つのテーブルを使って変換を行うことができる。 このような変換はデフォルトデータ変換と呼ばれる。
- CCSIDが両方ともASCIIまたは両方ともEBCDICの場合、 IBM MQ 、データは変換されずに受信アプリケーションに渡される。
- CCSIDの一方がASCIIで、もう一方がEBCDICの場合、 IBM MQ 、デフォルト値を使用して変換を行う。 ですから、あなたのプラットフォームでサポートされているASCII/EBCDICペアを使うべきです。
デフォルトのデータ変換を有効にするには ccsid_part2.tbl ファイル(プラットフォームによっては ccsid.tbl ファイル)を編集して、EBCDIC と ASCII のデフォルト値を定義している2行のコメントを解除する。 推奨されるデフォルトは500と850だが、これらの間の変換がサポートされていることを確認して、変更することができる。 詳しくは、ファイル内の説明をご覧ください。 この変更は、アプリケーションが次にキュー・マネージャに接続したとき(例えば、MQIアプリケーションが MQCONN コールを使用したとき)に反映されます。
- デフォルトのデータ変換は、アプリケーションデータの変換を意図したものではありません。 いずれにせよデフォルトのデータ変換を使用したい場合は、それを有効にするデータ変換出口を提供しなければならない。 例えばMQIコードでは、 MQXNCVC コールでMQDCC_DEFAULT_CONVERSIONパラメータを指定します。 なお crtmqcvx コマンドはこのパラメーターを含まないことに注意してください。
- デフォルト・データ変換が設定されている場合、例えばメッセージ・フォーマットが MQFMT_STRING のメッセージの変換を含む内部変換で使用されます。
- EBCDIC日本語CCSID290、930、1279、5026でデフォルトのデータ変換を使用する場合は注意が必要です。 これらのCCSIDで小文字のラテン文字に使用されるコードは、他のEBCDIC CCSID(CCSID500を含む)とは異なる。 EBCDICのデフォルト値を930または5026に設定し、ASCIIのデフォルト値を932、94、954、5050など、930または5026への変換に使用できるCCSIDに設定することを検討してください。 日本語のEBCDIC CCSIDを使う場合のもう一つの選択肢は、 IBM MQ のオブジェクト名にすべて大文字のラテン文字だけを使うようにすることである。
別のアプローチは、すべてのキューマネージャのCCSIDを単一言語に変更することです。 アプリケーション・データは、アプリケーションがメッセージ記述子に設定する値によって決定されるように、異なるCCSIDを使用することができます。