UTF-8 エンコーディング スキームは、可変幅の Unicode エンコーディングです。有効な各コード ポイントは、1 から 4 個の 8 ビット バイトを使用してエンコードされます。UTF-8 は、(ASCII との) 下位互換性があるため、一般的なエンコーディング スキームです。エンディアンに依存せず、多くの場合は UTF-16 よりも簡潔な Unicode 表現を提供します。
Visual COBOL は、UTF-8 データを定義、比較、および移動するためのネイティブ COBOL サポートを提供します。
UTF-8 データ項目は、固定文字長または固定バイト長にすることができます。
01 U1 PIC U(4). 01 U2 PIC UUUU.
各文字に必要な記憶域のバイト数は 4 バイトです。したがって、上記のデータ項目の例では、それぞれ 16 バイトの記憶域が必要になります。UTF-8 は可変幅のエンコーディングであるため、すべての文字で 4 バイトが必ず必要になるわけではありません。つまり、移動操作時に、予約済みのバイトがすべて使用されるとは限りません。そのような場合、未使用のバイトには、UTF-8 の空白文字エンコーディングとして x'20' が埋め込まれます。移動操作時に切り捨てが必要な場合、切り捨ては文字境界で行われます。
01 U3 PIC U BYTE-LENGTH 24
繰り返しになりますが、UTF-8 項目の可変長の性質により、データ項目の文字数は各文字のサイズによって変わります。ただし、常に、[ceil(n/4),n] の範囲内になります (n は指定されたバイト長です)。
UTF-8 リテラルには、基本リテラルと 16 進リテラルの 2 タイプがあります。
01 U4 PIC U VALUE u'lit-string'
lit-string はリテラル値です。2 バイト文字を指定する場合は、シフトアウト文字およびシフトイン文字で区切る必要があります。Unicode の可変幅の性質により、lit-string 内で使用可能な最大文字数は変化します。
\uhhhh または \U00hhhhhh を UTF-8 リテラルの文字列として含める場合は、エスケープ文字 (\) 自体をエスケープして (\ を使用)、文字列を文字どおりに解釈できます。たとえば、\\u00FF は Unicode エスケープ シーケンスとして処理されません。
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 リテラルと同じ意味を持つ内容になります。
次の COBOL 文は、UTF-8 データ項目の使用をサポートしています。
UTF-8 の比較は、字類 UTF-8 の 2 つの作用対象間の比較になります。これらの作用対象のいずれかが字類 UTF-8 でない場合 (その場合に許可されるのは英字、英数字、または各国文字の字類のみです)、その作用対象は比較の前に字類 UTF-8 の項目に変換されます。
MERGE 操作または SORT 操作時、比較はバイト単位のバイナリ比較を使用して実行されます。これは、同じ Unicode コード ポイントを表す、対応する各国文字列のセットと同じ順序になります (すべてのコード ポイントが基本多言語面から取得されると仮定した場合)。
作用対象の長さが等しくない場合、短い方の作用対象がもう一方の作用対象の長さまで (UTF-8 の後続空白文字で) 埋められたものとして比較が実行されます。
作用対象の長さが等しい場合 (または追加の埋め込みにより、長さが等しいと仮定された場合)、左端の位置から、対応する位置の文字が順番に比較されます。この比較は、一致しない UTF-8 文字が検出された場合、または右端の文字位置に達した場合のいずれか早い方で終了します。対応するすべての UTF-8 文字が等しい場合、作用対象は等しいと見なされます。
最初の一致しない文字が検出された際、比較によって作用対象の関係が判別されます。より大きい照合順序値を持つ UTF-8 文字を含む作用対象が、より大きい作用対象となります。
次のように、ネイティブ COBOL での UTF-8 データの処理をサポートする組み込み関数が多数あります。