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

ほとんどの東アジア言語では、コードページ文字列内の言語固有の文字(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 := '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 の H'8282')が 1 つの単位として扱われなかった結果です。この文字の末尾のバイトおよびその次の文字 "a"(H'61')が、誤ってダブルバイト文字セット "B"(コードページ Shift_JIS の H'8261')として解釈されています。

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

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

baab    828261618282
baab    828261618282

注意:
Windows では、Natural 出力ウィンドウが Unicode 対応になっています。これは、すべてのフィールドが Unicode フォーマットであることを意味します。ダブルバイト文字を含む A フォーマットフィールドの場合、Natural 出力ウィンドウの動作が若干変化します。A フォーマット入力フィールドでは、フィールドに "Unicode-string-length" 文字を入力できるようになりました。フィールドを離れるとき、デフォルトのコードページがダブルバイトコードページの場合、ターゲット A フォーマットフィールドに収まらないすべての文字が削除されます。例えば、A10 フィールドは 5 つのダブルバイト文字を保持できます。出力ウィンドウでは、このフィールドは、長さ 10、表示長 5 の Unicode フィールドで表されます。したがって、ユーザーは入力フィールドに 10 個のダブルバイト文字を入力できます。ユーザーがカーソルをページ上の別のフィールドに移動させるか、ENTER キーを押してページを離れると、フィールドの内容がコードページフォーマットに変換され、最初の 5 つのダブルバイト文字のみが残ります。