27.5.4 組み込み関数(AIX(32),AIX(64),Linux(x86),Linux(x64)で有効)

<この項の構成>
(1) Unicodeに対応した組み込み関数
(2) Unicodeに対応した組み込み関数の注意事項

(1) Unicodeに対応した組み込み関数

Unicodeの文字操作や文字数/けた数の取得,コード変換をする組み込み関数を次の表に示します。これらの組み込み関数の形式や使用例などの詳細は,マニュアル「COBOL2002 言語 拡張仕様編 24.2 組み込み関数」を参照してください。

表27-15 Unicodeに対応した組み込み関数

項番用途組み込み関数名概要
1文字列の取り出しSUBSTRING字類が英字,英数字,または日本語のデータ項目から部分文字列を返します。
2文字数の取得COUNT-CHAR字類が英字,英数字,または日本語のデータ項目の文字数を返します。
3けた数の取得LENGTH-OF-SUBSTRING字類が英字,英数字,または日本語のデータ項目の部分文字列のけた数を返します。
4コード変換DISPLAY-OF字類が日本語のデータ項目中のUTF-16の文字列をUTF-8の文字列に変換して返します。
5NATIONAL-OF字類が英数字のデータ項目中のUTF-8の文字列をUTF-16の文字列に変換して返します。

なお,Unicodeに対応した組み込み関数を使用した場合,Unicode文字の特性上,文字の判定や取得する処理の実行時間が増加する場合や,動作を保証できない場合があります。詳細は,「(2) Unicodeに対応した組み込み関数の注意事項」を参照してください。

(2) Unicodeに対応した組み込み関数の注意事項

(凡例)
○:EC-ARGUMENT-FUNCTION例外が成立する。
-:EC-ARGUMENT-FUNCTION例外が成立しない。
注※1
文字コードが不当な値の場合で,実行時エラーとなる例を次に示します。
(例)

01 DATA1 PIC X(30)
VALUE X'EFBDB1EFBDB2EFBDB3EFBDB4EFFDB5EFBDB6EFBDB7EFBDB8EFBDB9EFBDBA'.
*> アイウエオカキクケコにしたいが,14バイト目が不正(BDのはずがFDになっている。
*> この位置にFDがあるのはUTF-8として不正な文字と扱う)

MOVE FUNCTION SUBSTRING(DATA1, 2, 4) TO DATA2.

<実行結果>

KCCC2310R-S
組み込み関数処理中に文字コード不正を検出しました。
プログラム名=MAIN
行番号/欄=000022/15
関数名=SUBSTRING
詳細情報=引数1の14バイト目で文字コード不正を検出しました。
4バイト目以降:efbdb2efbdb3efbdb4effdb5efbdb6efbdb7efbdb8

「nバイト目以降:」の行には,不正を検出した位置とその前後10バイトが表示されます。上記の例では,14バイト目で不正を検出したため,前の10バイト(4~13バイト目),不正バイト(14バイト目),および後の10バイト(15~24バイト目)の計21バイトが表示されています。
注※2
次の場合が該当します。
  • 異体字セレクタが文字列の先頭にある
  • 異体字セレクタが連続している
(例)

FD FILE1.
01 GRP01 GROUP-USAGE NATIONAL.
 02  DATA1 PIC N(1).
 02  DATA2 PIC N(2).

01 DATA3    PIC N(6).

READ FILE1.
*>UTF-16の'葛'(X'845BDB40DD03')をファイルから読み取る。
*>このときDATA1にX'845B',DATA2にX'DB40DD03'が転記される。
MOVE FUNCTION SUBSTRING(DATA2, 1) TO DATA3.
*>DATA2の文字列は先頭から異体字セレクタとなっているため,不正な文字として扱う。

注※3
引数に指定した開始位置が,データ項目中の全角文字の途中となった場合の例を次に示します。
(例1)

01 DATA1 PIC X(4) VALUE 'あBC'.

MOVE FUNCTION SUBSTRING(DATA1, 2, 2 WIDTH) TO DATA2.
*>引数2で指定する開始位置は'あ'の途中を指しているため文字を正確に取り出せない。

(例2)

01 DATA1 PIC X(4) VALUE 'ABう'.

MOVE FUNCTION SUBSTRING(DATA1, 2, 2 WIDTH) TO DATA2.
*>引数2で指定する開始位置から引数3の長さだけ進めた文字位置は'う'の途中を
*> 指しているため文字を正確に取り出せない。

なお,IVSは基底文字+異体字で構成されます。ただし,基底文字だけでもUnicode文字として扱われるため,部分文字列として取得してもエラーになりません。