エスケープされた 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 データを生成するには、以下を実行します。

  1. ASCII_STR 関数または EBCDIC_STR 関数を使用します。

    これらの関数では、Unicode ストリングが ASCII ストリングまたは EBCDIC ストリングに変換されます。 ASCII または EBCDIC に存在しない文字は、¥xxxx という形式に変換されます。ここで、xxxx は UTF-16 コード単位を表します。

    文字を UTF-16 形式に変換する方法の詳細については、「Unicodeテーブルへのデータの挿入」 のINSERT文の説明にある手順2を参照してください。

  2. 後でエスケープされたデータを含む EBCDIC ストリングまたは ASCII ストリングを Unicode に戻す必要が生じる場合は、UNICODE_STR 関数を使用します。

    この関数の短い名前は UNISTR です。 この関数は、ソース・ストリングにあるエスケープされたデータを解釈します。 円記号 (「¥」) が先行している値は Unicode UTF-16 文字として 扱われます。 例えば、「¥0041」は、「A」の Unicode UTF-16 表現です。

汎用プログラミングインターフェース情報の開始。
例: データのエスケープ
T1.C1 に「Hi, my name is А н д р ей が含まれていると仮定します。 А н д р ей の文字は 一部はラテン文字に似ていますが、すべてキリル文字であることに注意してください。 SPUFI で次の照会を発行するとします。
SELECT C1 FROM T1;
この照会の結果は、CCSID が 37 に設定された 3270 端末エミュレーターでは次のように表示されます。
‘Hi, my name is ......'
А н д р ей の文字はCCSID 37には存在しないため、この名前は次のように表示されます......。 この問題を解決するため、次の例に示すように EBCDIC_STR 関数を追加できます。
SELECT EBCDIC_STR(C1)FROM T1;
Db2 は、エスケープされたデータを含む次の出力を返します。
‘Hi, my name is \0410\043D\0434\0440\0435\0439'
0410 はАの UTF-16 値であり、 043D はнの UTF-16 値である、というように続きます。
例: データのエスケープ解除
T1.C1 に「 А н д р ей が含まれていると仮定します。 次の照会を発行するとします。
SELECT HEX(UNISTR(ASCII_STR(C1))) FROM T1;
Db2 はこの照会を以下のように解釈します。
表 1. Db2 がUNISTRでクエリを解釈する方法
SELECT ステートメントの一部分 結果 説明
ASCII_STR(C1) \0410\043D\0434\0440\0435\0439 Db2C1 ( А н д рей ) の値を ASCII 文字列として返します これらの文字は ASCII で表現できないため、エスケープされます。
UNISTR(ASCII_STR(C1)) ああ そう Db2 は、エスケープされた ASCII 文字列を Unicode UTF-8 文字列に変換します。 UTF-8 にはこれらの文字がすべて含まれているので、エスケープする必要はありません。
HEX(UNISTR(ASCII_STR(C1))) D090D0BDD0B4D180D0B5D0B9 その後、Db2 は UTF-8 文字列の 16 進値を返します。
したがって、この照会の最終結果は次のようになります。
D090D0BDD0B4D180D0B5D0B9
類似した次の照会を発行するとします。
SELECT HEX(UNISTR(ASCII_STR(C1),UTF16)) FROM T1;
Db2 はこの照会を以下のように解釈します。
表 2. Db2 がUNISTRと UTF16 パラメータでクエリを解釈する方法
SELECT ステートメントの一部分 結果 説明
ASCII_STR(C1) \0410\043D\0434\0440\0435\0439 Db2C1 ( А н д рей ) の値を 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
汎用プログラミングインターフェース情報の終了。