COBOL2002 ユーザーズガイド


28.5.6 組み込み関数

〈この項の構成〉

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

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

表28‒14 Unicodeに対応した組み込み関数

項番

用途

組み込み関数名

概要

1

文字列の取り出し

SUBSTRING

字類が英字,英数字,または日本語のデータ項目から部分文字列を返します。

2

文字数の取得

COUNT-CHAR

字類が英字,英数字,または日本語のデータ項目の文字数を返します。

3

けた数の取得

LENGTH-OF-SUBSTRING

字類が英字,英数字,または日本語のデータ項目の部分文字列のけた数を返します。

4

コード変換

DISPLAY-OF

字類が日本語のデータ項目中のUTF-16の文字列をUTF-8の文字列に変換して返します。

5

NATIONAL-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文字として扱われるため,部分文字列として取得してもエラーになりません。