バージョン 6.3.3
 —  Unicode およびコードページのサポート  —

ダブルバイト文字サポート

ほとんどの東アジア言語では、コードページ文字列内の言語固有の文字(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 := 'baab'
 
WRITE #A #A (EM=H(6))
EXAMINE #A FOR PATTERN 'B' REPLACE 'a'
WRITE #A #A (EM=H(6))
 
END

ダブルバイト文字セットがサポートされない場合、上記のプログラムの出力は次のとおりです。

Page         1                             07-02-07    17:22:09
  												
baab    828261618282
Bab     826161828220  

これは、文字 "b"(コードページ "Shift_JIS" で "0x8282")が 1 つのユニットとして扱われなかった結果です。 この文字の末尾のバイトおよび次の文字 "a"("0x61")が、誤ってダブルバイト文字セット "B"(コードページ "Shift_JIS" で "0x8261")として解釈されています。

ダブルバイト文字セットがサポートされる場合、プログラムの出力は予期したとおりになります。

Page         1                             07-02-07    17:22:09

baab    828261618282
baab    828261618282

Top of page