ほとんどの東アジア言語では、コードページ文字列内の言語固有の文字(Natural フォーマット A)は 2 バイト(いわゆるダブルバイト文字セット)で表され、ASCII 文字は 1 バイトで表されます。そのため、コードページ文字列は、1 バイトと 2 バイトという異なる長さの文字で構成されます。
Natural は、ダブルバイト文字セットを基本的にサポートします。Windows では、このサポートは、Natural デフォルトコードページと Windows システムコードページの両方がダブルバイトコードページとして定義されている場合に有効です。Natural で特定のコードページが定義されていない場合は、ダブルバイトの Windows システムコードページが定義されていれば十分です。UNIX および OpenVMS では、ダブルバイト文字セットのサポートは、Natural デフォルトコードページがダブルバイトコードページである場合に有効です。
ダブルバイト文字セットのサポートが有効な場合、Natural では、すべての文字列操作について、ダブルバイト文字セットが 1 つのユニットとして処理されることが保証されます。このことは、文字列の意味を保持するために不可欠です。
フォーマット A の変数の操作の後(例えば、SUBSTRING
オプションを使用してサブストリングを抽出した後)でダブルバイト文字セットの先頭または末尾の 1 バイトが残された場合、このバイトは空白文字で置き換えられます。
次の例では、コードページ Shift_JIS が選択されています。変数 #A
には、4 文字で構成された文字列が含まれています。最初と最後の文字は、コードページ Shift_JIS でバイトシーケンス H'8282'
によって表されるダブルバイト文字セット "FULL WIDTH LATIN
SMALL LETTER B" です。2 番目と 3 番目の文字は、1 バイト H'61'
によって表されるシングルバイト文字 "LATIN SMALL LETTER A" です。したがって、文字列全体の 16 進表示は H'828261618282'
です。
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 の H'8282'
)が 1 つの単位として扱われなかった結果です。この文字の末尾のバイトおよびその次の文字 "a"(H'61'
)が、誤ってダブルバイト文字セット ""(コードページ Shift_JIS の H'8261'
)として解釈されています。
ダブルバイト文字セットがサポートされる場合、プログラムの出力は予期したとおりになります。
Page 1 07-02-07 17:22:09 aa 828261618282 aa 828261618282
注意:
Windows では、Natural 出力ウィンドウが Unicode 対応になっています。これは、すべてのフィールドが Unicode フォーマットであることを意味します。ダブルバイト文字を含む A フォーマットフィールドの場合、Natural
出力ウィンドウの動作が若干変化します。A フォーマット入力フィールドでは、フィールドに "Unicode-string-length" 文字を入力できるようになりました。フィールドを離れるとき、デフォルトのコードページがダブルバイトコードページの場合、ターゲット
A フォーマットフィールドに収まらないすべての文字が削除されます。例えば、A10 フィールドは 5 つのダブルバイト文字を保持できます。出力ウィンドウでは、このフィールドは、長さ 10、表示長 5 の Unicode フィールドで表されます。したがって、ユーザーは入力フィールドに
10 個のダブルバイト文字を入力できます。ユーザーがカーソルをページ上の別のフィールドに移動させるか、ENTER キーを押してページを離れると、フィールドの内容がコードページフォーマットに変換され、最初の 5 つのダブルバイト文字のみが残ります。