27.5.4 組み込み関数
(1) Unicodeに対応した組み込み関数
Unicodeの文字操作や文字数/けた数の取得,コード変換をする組み込み関数を次の表に示します。これらの組み込み関数の形式や使用例などの詳細は,マニュアル「COBOL2002 言語 拡張仕様編」 「23.2 組み込み関数」を参照してください。
項番 |
用途 |
組み込み関数名 |
概要 |
---|---|---|---|
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に対応した組み込み関数の注意事項
-
Unicode文字は特性上,シフトJISや日本語EUCと比べて1文字のサイズが多様なため,文字の判定や取得する処理の実行時間が増加します。シフトJISや日本語EUCの既存のプログラムをUnicode機能に移行してUnicodeに対応した組み込み関数を使用する場合は,実行時間が大きく増える場合があります。そのため,次の点に注意して組み込み関数を使用してください。
-
1文字のサイズが可変となる可能性がないデータ項目※の場合は,Unicodeに対応した組み込み関数を使用しないで,部分参照を使用して処理する。
注※
例えば,半角英数字だけ格納される英数字項目や,サロゲートペアおよびIVSを含む可能性がない日本語項目などが該当します。
-
Unicodeに対応した組み込み関数は,文字数の考慮が必要な処理の場合だけ使用する。
例えば,文字列の取り出しで,けた数と文字数の両方がわかっている場合は,けた数による部分参照を使用して処理します。
-
-
-UniObjGenコンパイラオプションを指定してコンパイルした組み込み関数を使用するプログラムを,実行時環境変数CBLLANGでUNICODEを指定していない環境で実行すると,実行時エラーが発生してプログラムの実行が中止します。
-
Unicodeの文字を格納するデータ項目のけた数が,格納しようとする文字の長さより短い場合,データ項目のけた数までのデータが格納されます。
Unicodeに対応した組み込み関数には,格納されるUnicode文字の長さを考慮したけた数を定義したデータ項目を指定する必要があります。
-
英数字集団項目の従属項目に,字類が英字および英数字の項目と,字類が日本語の項目が混在している場合,各項目の文字列をUnicode文字として扱えないことがあります。そのため,英数字集団項目の従属項目は,字類が英字および英数字の項目だけを使用してください。
-
組み込み関数の引数の指定に誤りがある場合は,次の表に示すように,実行時にEC-ARGUMENT-FUNCTION例外が発生します。
要因
組み込み関数名
COUNT-CHAR
DISPLAY-OF
LENGTH-OF- SUBSTRING
NATIONAL-OF
SUBSTRING
引数1の文字コードが不当な値である。※1
○
○
○
○
○
引数1の文字列中にある異体字セレクタが不当な位置にある。※2
○
−
○
−
○
引数2と引数3が一意名または算術式で,値が正の整数でない。
−
−
○
−
○
引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置が引数1の終端を超えている。
−
−
○
−
○
引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置が全角文字の途中である。※3
−
−
○
−
○
- (凡例)
-
○: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文字として扱われるため,部分文字列として取得してもエラーになりません。