COBOL2002 言語 拡張仕様編


25.5.4 LENGTH-OF-SUBSTRING関数

LENGTH-OF-SUBSTRING関数は,開始位置と長さを指定することによって,データ項目中の文字列から部分文字列の文字位置の個数を返す。開始位置と長さは,見た目幅または文字数で指定できる。この関数の型は,整数とする。

なお,この組み込み関数は,次のどちらかの場合に使用できる。

-UniObjGenオプションについては,マニュアル「COBOL2002 ユーザーズガイド」またはマニュアル「COBOL2002 使用の手引 手引編」のUnicode機能を参照のこと。

日本語EUC環境については,マニュアル「COBOL2002 使用の手引 手引編」のEUCコードを使用したCOBOLプログラムを参照のこと。

〈この項の構成〉

(1) 一般形式

[図データ]

(2) 引数

  1. 引数1は,字類が英字か英数字,または日本語でなければならない。

  2. 引数1に可変長集団項目を指定してはならない。また,引数1を部分参照してはならない。

  3. 引数1に動的長基本項目を指定してはならない。

  4. 引数1の文字コードは,次のどちらかでなければならない。

    字類

    文字コード

    Unicode機能

    日本語EUC環境

    英字,英数字

    UTF-8

    日本語EUC

    日本語

    UTF-16

  5. 引数2と引数3は,算術式でなければならない。

  6. 引数1,引数2および引数3に関数一意名およびオブジェクトプロパティは指定できない。なお,引数2および引数3については,算術式中も指定できない。

  7. 引数2および引数3は,ゼロでない正の整数でなければならない。

  8. 引数2および引数3に指定する値は次のとおりである。

    (ア)見た目幅で部分文字列の文字位置の個数を返す場合

    半角文字1文字を1,全角文字1文字を2として数えた値を指定する。このとき,同時にWIDTHも指定すること。

    (例)

    文字列'aあc'の見た目幅は4となる。この場合,部分文字列'c'の文字位置の個数を返すときは引数2に4,引数3に1を指定する。

    (イ)文字数で部分文字列の文字位置の個数を返す場合

    半角文字および全角文字の1文字を1として数えた値を指定する。このとき,WIDTHを指定しないこと。

    (例)

    文字列'aあc'の文字数は3となる。この場合,部分文字列'c'の文字位置の個数を返すときは引数2に3,引数3に1を指定する。

  9. 引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置は,引数1の終端を越えてはならない。

  10. 引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置は全角文字の途中を指してはならない。

  11. 引数1が英数字集団項目のとき,その従属項目の字類は英字,または英数字でなければならない。

(3) 関数値

  1. 引数3が指定されている場合,関数値は,引数2,引数3で指定する開始位置と長さで引数1から取り出した部分文字列の,文字位置の個数を返す。このとき,開始位置と長さの単位は次のとおりとする。

    (ア)WIDTHが指定されている場合

    引数2,引数3の単位は見た目幅として開始位置および長さを評価する。

    (イ)WIDTHが指定されていない場合

    引数2,引数3の単位は文字数として開始位置および長さを評価する。

  2. 引数3が指定されていない場合,関数値は,引数2で指定する開始位置から引数1の終端までの部分文字列の,文字位置の個数を返す。このとき,開始位置の単位は次のとおりとする。

    (ア)WIDTHが指定されている場合

    引数2の単位は見た目幅として開始位置を評価する。

    (イ)WIDTHが指定されていない場合

    引数2の単位は文字数として開始位置を評価する。

  3. 関数値の表現形式は,2進形式4バイト(64bit版COBOL2002では2進形式8バイト)となる。

(4) 使用例(Unicode機能)

(a) シフトJISでの部分文字列のけた数の取得

ある文字列のm文字目からn文字目を参照したい,または開始位置と長さを指定して文字を書き込みたい場合,シフトJISでは部分参照を使用できる。

次の文字列NAME-KNの8文字目から文字列を転記する文の例を示す。

[図データ]

記述例

[図データ]

シフトJISの場合,文字数とけた数が対応しているため,上記のように部分参照のけた数に文字数を指定して処理ができる。

(b) Unicodeでの部分文字列のけた数の取得

Unicodeの場合は,文字数とけた数が対応しないため,シフトJISと同様のコーディングができない。そこで,文字数をけた数に変換するLENGTH-OF-SUBSTRING関数を使用する。

LENGTH-OF-SUBSTRING関数を使用すると,引数に指定した開始位置と長さによって指定した文字列から,該当する文字列が占めるけた数を求めることができるため,その結果によって,部分参照を行うことができる。

英数字項目のときに見た目幅で指定する方法

文字列NAME-KNの8文字目から2文字分の文字列を転記する文の例を次に示す。

記述例

[図データ]

日本語項目のときに文字数で指定する方法
  • シフトJISの場合

    次の文字列NAME-KNの6文字目から文字列を転記する文の例を示す。

    [図データ]

    記述例

    [図データ]

  • Unicodeの場合

    次の文字列NAME-KNの7文字目から文字列を転記する文の例を示す。

    [図データ]

    記述例

    [図データ]

(5) 使用例(日本語EUC環境)

半角文字からなる文字列のm文字目からn文字目までを参照する,または開始位置と長さを指定して文字を書き込む場合,シフトJISと日本語EUCでは,それぞれ次の例に示すコーディングとなる。

(a) シフトJISでの部分文字列のけた数の取得

シフトJISの場合,半角文字が1バイト固定であるため,部分参照が使用できる。

(例)英数字NAME-KNの8文字目から文字列を転記

       01 NAME-KN PIC X(10) VALUE 'ヒタチ タロウ'.
             :
           MOVE 'サマ' TO NAME-KN(8:).  *> 結果:'ヒタチ タロウサマ'

(b) 日本語EUCでの部分文字列のけた数の取得

日本語EUCの場合,文字数とけた数が対応しないため,シフトJISと同じコーディングができない。そこで,文字数をけた数に変換するLENGTH-OF-SUBSTRING関数を使用する。

LENGTH-OF-SUBSTRING関数を使用すると,引数に指定した開始位置と長さによって,指定した文字列から当該文字列が占めるけた数を求めることができる。その結果を使って部分参照できる。

(例)文字列NAME-KNの8文字目から2文字分の文字列を転記

       01 NAME-KN PIC X(20) VALUE 'ヒタチ タロウ'.
             :
           COMPUTE NCHARPOS = 
               FUNCTION LENGTH-OF-SUBSTRING(NAME-KN, 1, 7).
               *> 13が求まる(半角かたかな2バイト*6 + 半角空白1バイト)
           MOVE 'サマ' TO NAME-KN(NCHARPOS + 1 : ).
           *> 結果:'ヒタチ タロウサマ'
           *> FUNCTION LENGTH-OF-SUBSTRINGの関数値「NCHARPOS」が
           *> 開始位置に使える