エスケープされた Unicode データの生成
Unicode データの処理を目的としていないアプリケーションまたはオブジェクトに Unicode 文字を渡す場合、特定の文字をエスケープしないと、データが失われることがあります。 例えば、EBCDIC ホスト変数を含むアプリケーションに Unicode データを渡す必要がある場合があります。 あるいは、非 Unicode 表に Unicode データを格納することがあります。
このタスクについて
また、3270 端末エミュレーター (SPUFI など) 上で稼働するアプリケーションから Unicode 文字を選択することもあります。 エミュレーターの CCSID 設定にこれらの Unicode 文字が含まれていない場合、出力でこれらの文字が適切に出力されません。
このような場合、アプリケーションまたはオブジェクトのコード化スキームで表現できない Unicode 文字は、エスケープしない限り失われます。 エスケープされたデータ とは、ターゲット CCSID で表現できず、エンコード値によって表現される 1 つ以上の文字です。 この表現により、データが維持されます。 例えば、Unicode 文字д のエスケープ版は、"\0434" です。 したがって、次のASCII文字列にはエスケープされた文字д が含まれています。 'The
escaped character is \0434'
エスケープされたデータを Unicode 表に挿入する場合、Db2 はそのデータを解釈せず、エスケープされない文字に変更します。 エスケープされたデータは、表が ASCII、EBCDIC、または Unicode 表であるかどうかに関係なく、Db2 表にそのまま格納されています。
プロシージャー
エスケープされた Unicode データを生成するには、以下を実行します。
例
- 例: データのエスケープ
- T1.C1 に「Hi, my name is А н д р ей 」 が含まれていると仮定します。 А н д р ей の文字は、 一部はラテン文字に似ていますが、すべてキリル文字であることに注意してください。 SPUFI で次の照会を発行するとします。
この照会の結果は、CCSID が 37 に設定された 3270 端末エミュレーターでは次のように表示されます。SELECT C1 FROM T1;
А н д р ей の文字はCCSID 37には存在しないため、この名前は次のように表示されます。‘Hi, my name is ......'......。 この問題を解決するため、次の例に示すように EBCDIC_STR 関数を追加できます。
Db2 は、エスケープされたデータを含む次の出力を返します。SELECT EBCDIC_STR(C1)FROM T1;
0410 はАの UTF-16 値であり、 043D はнの UTF-16 値である、というように続きます。‘Hi, my name is \0410\043D\0434\0440\0435\0439' - 例: データのエスケープ解除
- T1.C1 に「 А н д р ей 」 が含まれていると仮定します。 次の照会を発行するとします。
Db2 はこの照会を以下のように解釈します。SELECT HEX(UNISTR(ASCII_STR(C1))) FROM T1;したがって、この照会の最終結果は次のようになります。表 1. Db2 がUNISTRでクエリを解釈する方法 SELECT ステートメントの一部分 結果 説明 ASCII_STR(C1)\0410\043D\0434\0440\0435\0439Db2C1 ( А н д рей ) の値を ASCII 文字列として返します。 これらの文字は ASCII で表現できないため、エスケープされます。 UNISTR(ASCII_STR(C1))ああ、 そうだ Db2 は、エスケープされた ASCII 文字列を Unicode UTF-8 文字列に変換します。 UTF-8 にはこれらの文字がすべて含まれているので、エスケープする必要はありません。 HEX(UNISTR(ASCII_STR(C1)))D090D0BDD0B4D180D0B5D0B9その後、Db2 は UTF-8 文字列の 16 進値を返します。
類似した次の照会を発行するとします。D090D0BDD0B4D180D0B5D0B9
Db2 はこの照会を以下のように解釈します。SELECT HEX(UNISTR(ASCII_STR(C1),UTF16)) FROM T1;したがって、この照会の最終結果は次のようになります。表 2. Db2 がUNISTRと UTF16 パラメータでクエリを解釈する方法 SELECT ステートメントの一部分 結果 説明 ASCII_STR(C1)\0410\043D\0434\0440\0435\0439Db2C1 ( А н д рей ) の値を ASCII 文字列として返します。 これらの文字は ASCII で表現できないため、エスケープされます。 UNISTR(ASCII_STR(C1),UTF16)ああ、 そうだ Db2 は、エスケープされた ASCII 文字列を Unicode UTF-16 文字列に変換します。 UTF-16 にはこれらの文字がすべて含まれているので、エスケープする必要はありません。 HEX(UNISTR(ASCII_STR(C1)))D090D0BDD0B4D180D0B5D0B9その後、Db2 は UTF-16 文字列の 16 進値を返します。 0410043D0434044004350439