ほとんどの東アジア言語では、コードページ文字列内の言語固有の文字(Natural フォーマット A)は 2 バイト(いわゆるダブルバイト文字セット)で表され、ASCII 文字(メインフレーム上の EBCDIC)は 1 バイトで表されます。 そのため、コードページ文字列は、1 バイトと 2 バイトという異なる長さの文字で構成されます。
Natural は、ダブルバイト文字セットを基本的にサポートします。 Windows では、このサポートは、Natural デフォルトコードページと Windows システムコードページの両方がダブルバイトコードページとして定義されている場合に有効です。
Natural で特定のコードページが定義されていない場合は、ダブルバイトの Windows システムコードページが定義されていれば十分です。 UNIX および OpenVMS では、ダブルバイト文字セットのサポートは、Natural デフォルトコードページがダブルバイトコードページである場合に有効です。
メインフレームでは、プロファイルパラメータ CP
が EBCDIC MBCS コードページ(IBM-942 など)に設定されている必要があります。
ダブルバイト文字セットのサポートが有効な場合、Natural では、すべての文字列操作について、ダブルバイト文字セットが 1 つのユニットとして処理されることが保証されます。 このことは、文字列の意味を保持するために不可欠です。
フォーマット A の変数の操作の後(例えば、SUBSTRING
オプションを使用してサブストリングを抽出した後)でダブルバイト文字セットの先頭または末尾の 1 バイトが残された場合、このバイトは空白文字で置き換えられます。
次の例では、コードページ "Shift_JIS" が選択されています。 変数 #A
には、4 文字で構成された文字列が含まれています。 最初と最後の文字は、コードページ "Shift_JIS" でバイトシーケンス "0x8282" によって表されるダブルバイト文字セット "FULL WIDTH LATIN SMALL LETTER B" です。 2 番目と 3 番目の文字は、1 バイト "0x61" によって表されるシングルバイト文字 "LATIN SMALL LETTER A" です。 したがって、文字列全体の 16 進表示は "0x828261618282" です。
DEFINE DATA LOCAL 1 #A (A10) END-DEFINE #A := 'aa' WRITE #A #A (EM=H(6)) EXAMINE #A FOR PATTERN '' REPLACE 'a' WRITE #A #A (EM=H(6)) END
ダブルバイト文字セットがサポートされない場合、上記のプログラムの出力は次のとおりです。
Page 1 07-02-07 17:22:09 aa 828261618282 a 826161828220
これは、文字 ""(コードページ "Shift_JIS" で "0x8282")が 1 つのユニットとして扱われなかった結果です。 この文字の末尾のバイトおよび次の文字 "a"("0x61")が、誤ってダブルバイト文字セット ""(コードページ "Shift_JIS" で "0x8261")として解釈されています。
ダブルバイト文字セットがサポートされる場合、プログラムの出力は予期したとおりになります。
Page 1 07-02-07 17:22:09 aa 828261618282 aa 828261618282