UTF-8 データ

UTF-81 エンコーディング スキームは、可変幅の Unicode エンコーディングです。有効な各コード ポイントは、1 から 4 個の 8 ビット バイトを使用してエンコードされます。UTF-8 は、(ASCII との) 下位互換性があるため、一般的なエンコーディング スキームです。エンディアンに依存せず、多くの場合は UTF-16 よりも簡潔な Unicode 表現を提供します。

Enterprise Developer は、UTF-8 データを定義、比較、および移動するためのネイティブ COBOL サポートを提供します。

UTF-8 データ項目

UTF-8 データ項目は、固定文字長または固定バイト長にすることができます。

固定文字長のデータ項目
このタイプのデータ項目を PICTURE 句内で定義するには、1 つ以上の U 文字を指定するか、単一の U の後に繰り返し係数を指定します。各 U 文字は、1 から 4 バイトの間で長さが変化する、単一の Unicode コード ポイントを表します(固定文字長の項目では、BYTE-LENGTH 句を指定しないでください)。
01 U1 PIC U(4).
01 U2 PIC UUUU.

各文字に必要な記憶域のバイト数は 4 バイトです。したがって、上記のデータ項目の例では、それぞれ 16 バイトの記憶域が必要になります。UTF-8 は可変幅のエンコーディングであるため、すべての文字で 4 バイトが必ず必要になるわけではありません。つまり、移動操作時に、予約済みのバイトがすべて使用されるとは限りません。そのような場合、未使用のバイトには、UTF-8 の空白文字エンコーディングとして x'20' が埋め込まれます。移動操作時に切り捨てが必要な場合、切り捨ては文字境界で行われます。

固定バイト長のデータ項目
このタイプのデータ項目を PICTURE 句内で定義するには、単一の U 文字を指定し、BYTE-LENGTH 句を含めます。BYTE-LENGTH 句は、データ項目の長さの正確なバイト数を示します。
01 U3 PIC U BYTE-LENGTH 24

繰り返しになりますが、UTF-8 項目の可変長の性質により、データ項目の文字数は各文字のサイズによって変わります。ただし、常に、[ceil(n/4),n] の範囲内になります (n は指定されたバイト長です)。

UTF-8 リテラル

UTF-8 リテラルには、基本リテラルと 16 進リテラルの 2 タイプがあります。

基本リテラル
基本リテラルは、次のように定義できます。
01 U4 PIC U VALUE u'lit-string'

lit-string はリテラル値です。2 バイト文字を指定する場合は、シフトアウト文字およびシフトイン文字で区切る必要があります。Unicode の可変幅の性質により、lit-string 内で使用可能な最大文字数は変化します。

lit-string には、次の形式の Unicode エスケープ シーケンスを含めることもできます。
  • \uhhhh - 各 h は、0 から 9、a から f、および A から F の範囲の 1 つの 16 進数値を表します。このエスケープ シーケンスは、U+0000 から U+FFFF の範囲内の、基本多言語面 (BMP) の Unicode コード ポイントに対応します。
  • \U00hhhhhh - 各 h は、0 から 9、a から f、および A から F の範囲の 1 つの 16 進数値を表します。このエスケープ シーケンスは、基本多言語面または任意の追加面の Unicode コード ポイントに対応します。つまり、上記の範囲だけでなく、U+10000 から U+10FFFF も含まれます。
注: コード ポイント U+D800 から U+DFFF は、UTF-16 で使用されるサロゲート ペアの上半分と下半分のために予約されています。したがって、\uD800 から \uDFFF および \U0000D800 から \U0000DFFF を UTF-8 リテラルの Unicode エスケープ シーケンスとして指定しないでください。

\uhhhh または \U00hhhhhh を UTF-8 リテラルの文字列として含める場合は、エスケープ文字 (\) 自体をエスケープして (\ を使用)、文字列を文字どおりに解釈できます。たとえば、\\u00FF は Unicode エスケープ シーケンスとして処理されません。

16 進リテラル
16 進リテラルは、次のように定義できます。
01 U5 PIC U VALUE ux'hex-string'

hex-string には、0 から 9、a から f、および A から F の範囲の 2 つ以上の 16 進数値を指定できます。2 桁の各グループは、1 つの UTF-8 文字の単一のエンコーディングを表します。

hex-string で表されるバイト シーケンスは、有効な UTF-8 バイト シーケンスが含まれていることを確認するために検証されます。有効なバイト シーケンスが含まれている場合、この 16 進表記は UTF-8 文字として格納され、同じ文字を指定する基本 UTF-8 リテラルと同じ意味を持つ内容になります。

UTF-8 データ項目をサポートする COBOL 文

次の COBOL 文は、UTF-8 データ項目の使用をサポートしています。

  • ALLOCATE および FREE
  • EVALUATE および IF (下記の「UTF-8 の比較」を参照)
  • INITIALIZE - UTF-8 データ項目の項類のデフォルトは UTF-8 の空白文字 (x'20') です
  • MERGE および SORT (下記の「UTF-8 の比較」を参照)
  • MOVE - MOVE の基本的な規則は次のとおりです
    • 字類 UTF-8 の項目は、字類が各国文字または UTF-8 の項目にのみ移動できます。
    • 字類 UTF-8 の項目は、字類が英字、英数字、各国文字、または UTF-8 の項目のみを受け取ることができます。
      注: 送り出し側項目には、数字編集、英数字編集、各国文字編集、および各国文字数字編集も含まれます。

UTF-8 の比較

UTF-8 の比較は、字類 UTF-8 の 2 つの作用対象間の比較になります。これらの作用対象のいずれかが字類 UTF-8 でない場合 (その場合に許可されるのは英字、英数字、または各国文字の字類のみです)、その作用対象は比較の前に字類 UTF-8 の項目に変換されます。

MERGE 操作または SORT 操作時、比較はバイト単位のバイナリ比較を使用して実行されます。これは、同じ Unicode コード ポイントを表す、対応する各国文字列のセットと同じ順序になります (すべてのコード ポイントが基本多言語面から取得されると仮定した場合)。

作用対象の長さが等しくない場合、短い方の作用対象がもう一方の作用対象の長さまで (UTF-8 の後続空白文字で) 埋められたものとして比較が実行されます。

作用対象の長さが等しい場合 (または追加の埋め込みにより、長さが等しいと仮定された場合)、左端の位置から、対応する位置の文字が順番に比較されます。この比較は、一致しない UTF-8 文字が検出された場合、または右端の文字位置に達した場合のいずれか早い方で終了します。対応するすべての UTF-8 文字が等しい場合、作用対象は等しいと見なされます。

最初の一致しない文字が検出された際、比較によって作用対象の関係が判別されます。より大きい照合順序値を持つ UTF-8 文字を含む作用対象が、より大きい作用対象となります。

注: 照合順序値の大きさは文字の 16 進値を使用して判別されます。PROGRAM COLLATING SEQUENCE 句は、UTF-8 の比較には影響しません。

UTF-8 データ項目の組み込み関数のサポート

次のように、ネイティブ COBOL での UTF-8 データの処理をサポートする組み込み関数が多数あります。

  • BIT-OF
  • BYTE-LENGTH
  • DISPLAY-OF
  • HEX-OF
  • LENGTH
  • LOWER-CASE
  • NATIONAL-OF
  • TRIM
  • ULENGTH
  • UPOS
  • UPPER-CASE
  • USUBSTR
  • USUPPLEMENTARY
  • UVALID
  • UWIDTH
1 字類 UTF-8 の項目はネイティブ COBOL でのみサポートされます